Uploads #1
|
|
@ -15,6 +15,7 @@ export default class UploadController extends Controller {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
|
|
||||||
this._promptForUpload((files) => {
|
this._promptForUpload((files) => {
|
||||||
|
files.sort((a, b) => b.lastModified - a.lastModified);
|
||||||
this._doUploads(files);
|
this._doUploads(files);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,8 @@ func (s *Service) FinalizePending(ctx context.Context, pendingGUID string, expec
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingDataFilename := filepath.Join(s.pendingDir, pu.GUID+".upload")
|
pendingDataFilename := filepath.Join(s.pendingDir, pu.GUID+".upload")
|
||||||
if err := s.verifyPendingUpload(pendingDataFilename, expectedHash); err != nil {
|
fileSize, err := s.verifyPendingUpload(pendingDataFilename, expectedHash)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -113,7 +114,7 @@ func (s *Service) FinalizePending(ctx context.Context, pendingGUID string, expec
|
||||||
newUpload := models.Upload{
|
newUpload := models.Upload{
|
||||||
SiteID: site.ID,
|
SiteID: site.ID,
|
||||||
GUID: models.NewNanoID(),
|
GUID: models.NewNanoID(),
|
||||||
FileSize: pu.FileSize,
|
FileSize: fileSize,
|
||||||
MIMEType: pu.MIMEType,
|
MIMEType: pu.MIMEType,
|
||||||
Filename: pu.Filename,
|
Filename: pu.Filename,
|
||||||
CreatedAt: newTime,
|
CreatedAt: newTime,
|
||||||
|
|
@ -136,30 +137,31 @@ func (s *Service) FinalizePending(ctx context.Context, pendingGUID string, expec
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) verifyPendingUpload(pendingDataFilename string, expectedHash string) error {
|
func (s *Service) verifyPendingUpload(pendingDataFilename string, expectedHash string) (fileSize int64, _ error) {
|
||||||
expectedHashBytes, err := hex.DecodeString(expectedHash)
|
expectedHashBytes, err := hex.DecodeString(expectedHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(pendingDataFilename); err != nil {
|
stats, err := os.Stat(pendingDataFilename)
|
||||||
return err
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingDataFile, err := os.Open(pendingDataFilename)
|
pendingDataFile, err := os.Open(pendingDataFilename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
defer pendingDataFile.Close()
|
defer pendingDataFile.Close()
|
||||||
|
|
||||||
shaSum := sha256.New()
|
shaSum := sha256.New()
|
||||||
if _, err := io.Copy(shaSum, pendingDataFile); err != nil {
|
if _, err := io.Copy(shaSum, pendingDataFile); err != nil {
|
||||||
return err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !bytes.Equal(shaSum.Sum(nil), expectedHashBytes) {
|
if !bytes.Equal(shaSum.Sum(nil), expectedHashBytes) {
|
||||||
return errors.New("hash mismatch")
|
return 0, errors.New("hash mismatch")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return stats.Size(), nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue