func writeOutData()

in uploadhandler.go [37:73]


func writeOutData(fullpath string, maybeRange *helpers.RangeHeader, content io.Reader) (int64, error) {
	dirpath := path.Dir(fullpath)
	if _, err := os.Stat(dirpath); os.IsNotExist(err) {
		log.Printf("INFO Uploadandler.writeOutData target path %s does not exist, creating", dirpath)
		mkDirErr := os.MkdirAll(dirpath, 0775)
		if mkDirErr != nil {
			log.Printf("ERROR UploadHandler.writeOutData could not create directory %s: %s", dirpath, mkDirErr)
			return -1, mkDirErr
		}
	}

	//FIXME: this over-writes an existing file
	openFlags := os.O_WRONLY
	if maybeRange != nil && maybeRange.IsFirst() {
		openFlags |= os.O_CREATE | os.O_TRUNC
	}

	f, openErr := os.OpenFile(fullpath, openFlags, 0664)
	if openErr != nil {
		log.Printf("ERROR UploadHandler.writeOutData could not open %s to write: %s", fullpath, openErr)
		return -1, openErr
	}
	defer f.Close()

	if maybeRange == nil || maybeRange.IsComplete() {
		log.Printf("INFO UploadHandler.writeOutData no range so writing whole file")
		return io.Copy(f, content)
	} else {
		_, seekErr := f.Seek(maybeRange.Start, os.SEEK_SET)
		if seekErr != nil {
			log.Printf("ERROR UploadHandler.writeOutData could not seek '%s': %s", fullpath, seekErr)
			return -1, seekErr
		}
		//FIXME: check if this actually writes correctly
		return io.Copy(f, content)
	}
}