Implement WriteFileChunk
This commit is contained in:
parent
b0999b29ca
commit
815964e4a8
|
@ -1,6 +1,9 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
@ -27,6 +30,47 @@ func (s *DataStore) CreateFile(id string, size int64) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (s *DataStore) WriteFileChunk(id string, start int64, end int64, src io.Reader) error {
|
||||
file, err := os.OpenFile(dataPath(id), os.O_WRONLY, 0666)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
if n, err := file.Seek(start, os.SEEK_SET); err != nil {
|
||||
return err
|
||||
} else if n != start {
|
||||
return errors.New("WriteFileChunk: seek failure")
|
||||
}
|
||||
|
||||
size := end - start + 1
|
||||
if n, err := io.CopyN(file, src, size); err != nil {
|
||||
return err
|
||||
} else if n != size {
|
||||
return errors.New("WriteFileChunk: partial copy")
|
||||
}
|
||||
|
||||
return s.appendFileLog(id, fmt.Sprintf("%d,%d", start, end))
|
||||
}
|
||||
|
||||
func (s *DataStore) appendFileLog(id string, entry string) error {
|
||||
logPath := s.logPath(id)
|
||||
logFile, err := os.OpenFile(logPath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer logFile.Close()
|
||||
|
||||
if _, err := logFile.WriteString(entry + "\n"); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *DataStore) filePath(id string) string {
|
||||
return path.Join(s.dir, id)
|
||||
}
|
||||
|
||||
func (s *DataStore) logPath(id string) string {
|
||||
return s.filePath(id) + ".log"
|
||||
}
|
||||
|
|
|
@ -89,7 +89,7 @@ func postFiles(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
if contentRange.End != -1 {
|
||||
if err := putFileChunk(id, contentRange.Start, contentRange.End, r.Body); err != nil {
|
||||
if err := dataStore.WriteFileChunk(id, contentRange.Start, contentRange.End, r.Body); err != nil {
|
||||
// @TODO: Could be a 404 as well
|
||||
reply(w, http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
|
|
Loading…
Reference in New Issue