2016-03-12 97 views
0

我們正在進行文件上傳並選擇了blueimp插件。我們有以下方式工作。Asp.net MVC異步加載問題

用戶選擇他們希望上傳的所有文件,然後單擊一個按鈕即可全部上傳。

這部分工作正常,一次向服務器發送所有文件。

服務器代碼示例僅如下。

public async Task<ActionResult> Upload() 
{ 
    var result = await new Uploader().UploadFile(Request.Files[0]); 
    return Json(result); 
} 
public class Uploader 
{ 
    public async Task<UploadResult> UploadFile(HttpPostedFileBase file) 
    { 
     //do file processing and save file to disk 
     var filerecord = _fileService.GetById(xxxx); 
     filerecord.files.Add(new Info { name = file.FileName, size = file.ContentLength }); 
     //Here for us its Mongo but any not sure what the result would be against another db 
     await _fileService.SaveAsync(filerecord); 
     return new UploadResult { message = "ok" }; 
    } 
} 

//js 
    fi.fileupload({ 
     url: 'uploadfile', 
     dataType: 'json', 
     autoUpload: false, 
     singleFileUploads:false, 
     maxNumberOfFiles: maxFiles, 
     acceptFileTypes: /(\.|\/)(jpe?g)$/i, 
     maxFileSize: 1048576*2, //1MB 
     messages: { }, 
     // Enable image resizing, except for Android and Opera, 
     // which actually support image resizing, but fail to 
     // send Blob objects via XHR requests: 
     disableImageResize: true, 
     previewMaxWidth: 50, 
     previewMaxHeight: 50, 
     previewCrop: false, 
     dropZone: $('#dropzone') 
    }); 

    fi.on('fileuploadadd', function (e, data) { 

     $('form').submit(function (e) { 
      data.submit(); 
      return false; 
     }); 
}); 

剛一說明,在這種情況下,DB是蒙戈

的問題 同時上傳單個文件即選擇一個文件,點擊上傳所有的作品如預期。 選擇多個文件並點擊上傳按鈕,所有文件都會上傳並保存到磁盤中,無任何問題。但是我希望以下行爲

  1. 從數據庫
  2. 添加信息有關文件
  3. 保存記錄

如前所述這一次的偉大工程同一個文件,但在獲取記錄他們都立即進來我猜測異步行爲導致該方法鬆散其工作文件的上下文,因爲調試器中的3個步驟似乎被隨機調用而不是按順序調用。

我嘗試了各種方法,如改變的事情發生的方式順序,也使用ConfigureAwait等

任何意見,將不勝感激。

+0

我自己通過所有上傳的文件使用多MIME類型和循環。這樣我就可以處理每個文件相應上傳 –

+0

@John Ephraim你認爲,因爲我沒有檢查多部分,只是使用file.SaveAs保存文件PostedFile,這可能是導致數據庫端的隨機性? – AliK

+0

不,不應該與隨機性有任何關係。你說的行爲是由異步操作引起的無序處理序列造成的。你可以展示更多的Upload方法,比如你如何準確地將所有的Request.Files傳遞給你的Uploader.UploadFile? –

回答

0

如果我理解你的情況正確的代碼應該爲你工作:

public async Task<ActionResult> Upload() 
{ 
    var files = new HttpPostedFileBase[Request.Files.Count]; 
    Request.Files.CopyTo(files, 0); 
    var tasks = files.Select(f=>new Uploader().UploadFile(f)); 
    await Task.WhenAll(tasks); 
    return Json(tasks.Where(v=>v.Status == TaskStatus.RanToCompletion).Select(v=>v.Result).ToList()); 
} 
+0

文件集合中沒有選擇。 – AliK

+0

我已經更新了我的答案,請你試一試 –