【发布时间】:2015-12-10 20:28:12
【问题描述】:
我现在已经在多个版本中使用 FineUploader,我喜欢你们所做的。这是关于使用 jquery 包装器的 v5.3.0。
我目前正在处理的项目需要对文件进行分块(有些文件大到 2GB),而且我已经开始分块了。我可以上传几块,仅此而已。
我创建的分块过程会根据 qqUUID 创建一个文件夹,并将分块放入该文件夹中。这些块仅由它们的 qqpartindex(0、1、2 等)命名,因此可以稍后对其进行排序和重建。在这一点上我还没有走到这一步,所以如果这是错误的,请纠正我。在出现错误之前我只能保存 3 个文件(对于 20mb 的测试文件)。我收到此错误:'XHR 返回了响应代码 0',尽管我不是跨站点脚本(本地运行的应用程序,对要保存的网络资源具有正确的权限),而且我总是可以保存 3 个文件,仅此而已。奇怪的是我可以得到一些工作,但就是这样。我错过了什么?感谢您的帮助!
请参阅下面的客户端 Fineuploader 代码,该代码有效:
<script type="text/javascript">
var filesToUpload = 0;
var uploadedFileCounter = 0;
var po = '@Model.PurchaseOrder';
var companyNumber = '@Model.CompanyNumber';
$().ready(function () {
var fineuploader = $('#files-upload').fineUploader({
debug: false,
template: 'qq-template',
button: $("#uploadButton"),
request:
{
endpoint: '@Url.Action("UploadFile", "Upload")',
forceMultipart: true,
customHeaders: { Accept: 'application/json' },
params: {
po: (function () { return po; }),
companyNumber: (function () { return companyNumber; }),
}
},
validation: {
acceptFiles: ['image/*', +
'audio/mp4a-latm'],
allowedExtensions: ['jpeg', 'jpg', 'gif', 'png', 'bmp', 'm4a'],
sizeLimit: 1024 * 1024 * 1024 * 2, // 2 GB
stopOnFirstInvalidFile: false
},
chunking: {
enabled: true,
concurrent: {
enabled: true
},
mandatory: true,
success: {
endpoint: '@Url.Action("UploadChunksComplete", "Upload")'
}
//, expected: false // allow cross-domain requests
},
failedUploadTextDisplay: {
mode: 'custom'
},
multiple: true
}).on('submitted', function (event, id, filename) {
filesToUpload++;
$(':input[type=button], :input[type=submit], :input[type=reset]').attr('disabled', 'disabled');
}).on('complete', function (event, id, filename, responseJSON) {
uploadedFileCounter++;
if (filesToUpload == uploadedFileCounter) {
$(':input[type=button], :input[type=submit], :input[type=reset]').removeAttr('disabled');
}
}).on('error', function (event, id, name, errorReason, xhr) {
alert('error: ' + errorReason);
});
});
块的服务器端代码看起来像这样,它“有效”,我可以进入它:
[HttpPost]
public HttpResponseMessage UploadFile(HttpPostedFileWrapper qqfile, string po, string companyNumber)
{
var id = Request["qquuid"];
var filename = (Request["qqpartindex"]);
var x = FileProcessor.Storage.SaveChunk(qqfile, id, filename, Config.Instance.TemporaryChunkDirectory);
var response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
return response;
}
作为单独项目的一部分的 SaveChunk 方法如下所示:
public static bool SaveChunk(HttpPostedFileWrapper file, string id, string filename, string fileTemporarySavePath)
{
if (!VerifyFile(file)) { return false; }
if (filename == null) { filename = "0"; } // creating index 0 for files that don't actually need chunk
Common.CreateTempDirectory(fileTemporarySavePath, id);
try
{
var pathfilename = string.Join("\\", fileTemporarySavePath, id, filename);
file.SaveAs(pathfilename);
return true;
}
catch (Exception ex)
{
var error = ex.Message.ToString();
return false;
}
}
【问题讨论】:
-
您最近是否打开了
chunking.concurrent选项?关闭后一切正常吗? -
开启与否都不行。控制台当前显示:[Fine Uploader 5.3.0] 尝试解析 xhr 响应文本时出错(意外令牌 S)(第 249 行 qq.log - window.console[level](message);)
标签: file-upload upload fine-uploader chunks chunking