【问题标题】:Fineuploader Chunking - can upload several, but then failsFineuploader Chunking - 可以上传多个,但随后失败
【发布时间】: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


【解决方案1】:

我需要添加

{"success":true}

到请求的正文,而不只是在标头中返回 OK 状态。我的错。继续下一个任务,谢谢!

【讨论】:

  • 嗯,我不确定这将如何导致您的问题中发布日志消息。
【解决方案2】:

响应代码 0 通常表示客户端和服务器之间存在网络问题。更具体地说,这表明收到了一个完全空的响应(没有标头或有效负载)。如果客户端和服务器之间的网络连接断开,或者服务器在某个地方发生故障并由于未经检查的错误而返回空响应,则可能会发生这种情况。

【讨论】:

  • 除了在每个块的响应中发回 200 之外,我还遗漏了什么吗?
  • 如果浏览器报告状态 0,则不会返回 200,或者至少该响应没有进入浏览器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多