【发布时间】:2016-03-12 08:42:42
【问题描述】:
我们正在处理文件上传并选择了 blueimp 插件。我们通过以下方式进行这项工作。
用户选择他们要上传的所有文件,然后单击按钮一次性上传所有文件。
这部分工作正常,一次将所有文件发送到服务器。
仅服务器代码示例如下。
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;
});
});
请注意,本例中的数据库是 Mongo
问题 一次上传单个文件,即选择一个文件点击上传所有作品都按预期工作。 选择多个文件并点击上传按钮,所有文件都被上传并保存到磁盘,没有问题。但是我希望有以下行为
- 从数据库中获取记录
- 添加文件信息
- 保存记录
如前所述,这一次处理一个文件效果很好,但是当它们同时进入时,我猜测异步行为会导致该方法失去其正在处理的文件的上下文,因为调试器中的 3 个步骤似乎是每个文件随机调用,而不是按顺序调用。
我尝试了各种方法,比如改变事情发生的顺序,也使用 ConfigureAwait 等。
任何建议将不胜感激。
【问题讨论】:
-
我自己使用多部分 mime 类型并循环浏览所有上传的文件。这样我可以相应地处理每个上传的文件
-
@John Ephraim 您是否认为因为我没有检查多部分,而只是使用 PostedFile 上的 file.SaveAs 保存文件,这可能是导致数据库端随机性的原因?跨度>
-
不,它应该与随机性没有任何关系。您对由异步操作引起的行为导致无序的处理序列是正确的。您能否展示更多您的 Upload 方法,例如您如何将所有 Request.Files 准确传递给 Uploader.UploadFile?
-
@AliK:不,
async不会导致这些步骤出现故障。使用您发布的代码,不可能无序地执行这些步骤。它们可以交错 - 即,它可以获取第二个文件的数据库记录而第一个正在保存,但它们不会是随机的或丢失它们是什么文件的上下文工作。 -
@JohnEphraimTugado 我传递的文件与我使用 Request.Files[0] 显示的完全一样,这始终是第一个进来的文件,因为我没有得到多个文件,因为我没有在表单上设置多个只允许通过一次选择一个并一次性发布来进行多次上传。
标签: c# asp.net asp.net-mvc file-upload