【问题标题】:Why is my file data being lost in transfer?为什么我的文件数据在传输过程中丢失了?
【发布时间】:2013-03-25 01:14:18
【问题描述】:

好的,所以我从一个不同的问题中找到了这种上传大文件的方法:

function sliceit(file)
{
    fr = new FileReader;
    chunkSize = 1000000;            

    chunks = Math.ceil(file.size / chunkSize);
    chunk = 0;
    var isstart = true;

    function loadNext() {
        start, end,
        start = chunk * chunkSize;
        if (start > file.size)
            start = end+1;
        end = start + (chunkSize -1) >= file.size ? file.size : start + (chunkSize -1);
        fr.onloadend = function(e)
        {
            while(!fr.result || fr.result == "" || fr.result == undefined)
            {
            }
            fdata = fr.result;
            xmlhttp, form, data;
            data = {};
            data.filename = document.getElementById("filename0").value;
            data.username = document.getElementById("username").value;
            data.password = document.getElementById("password").value;
            data.public = document.getElementById("public").value;
            if(isstart)
            {
                var form = new FormData();
                form.append("filename", data.filename);
                form.append("username", data.username);
                form.append("password", data.password);
                form.append("public", data.public);
                form.append("filebytes", fdata);
                xmlhttp = jQuery.ajaxSettings.xhr();
                xmlhttp.open("POST", "../MakeEmptyFile.php", false);
                isstart = false;
            }
            else
            {
                form = new FormData();
                form.append("filename", data.filename);
                form.append("username", data.username);
                form.append("password", data.password);
                form.append("filebytes", fdata);
                xmlhttp = jQuery.ajaxSettings.xhr();
                xmlhttp.open("POST", "../AddTo.php", false);
            }
            xmlhttp.send(form);
            console.log(xmlhttp.responseText);
            if (++chunk <= chunks)
            {
                loadNext();
            }
            else
            {
                stdlog("Completed.");
            }
        };
        fr.readAsText(file.slice(start, end));

    }
    loadNext();
}

由于某种原因,每次我加载 XMLHttpRequest 时,它都显示文件数据从未真正发送过。这是因为它太大了,还是什么?谢谢!

【问题讨论】:

  • 你为什么使用 FileReader?
  • @RayNicholus 因为我上传的文件太大而无法正常发送,所以我使用 FileReader 对象一次读取大约 10 兆字节,这应该足够慢。
  • 这不是 FileReader 的用途。无需使用 FileReader 将文件拆分为块。只需在 File 对象上使用 slice 方法并将生成的 Blob 发送到您的服务器。
  • @RayNicholus 这行得通吗? blob 会以字符串还是上传文件的形式发送到服务器?

标签: javascript upload xmlhttprequest


【解决方案1】:

听起来您缺少一些与 File API 相关的基本概念。我在这里的回答来自您问题的 cmets。

首先,分块上传文件的正确方法是在BlobFile 对象上使用the slice methodslice 方法将始终返回另一个 Blob。这个Blob 代表你已经雕刻出的BlobFile 的一部分。然后,您可以将 append 那个 Blob 发送到您的 FormData 对象。您的 FormData 对象将在多部分编码的 POST 请求中发送。 Blob 将在请求中的多部分边界之一内表示为表单字段,就像您附加到 FormData 对象的任何其他参数一样。

在服务器端,您会像在解析 MPE 请求时读取任何其他文件一样读取此 Blob。这个Blob 需要与构成完整文件的任何其他Blobs 一起临时存储在服务器端。收到所有零件后,您需要在服务器端以正确的顺序组装它们。

您当前的方法包括将文件分割成 blob,读取 blob 的全部内容,然后将内容附加到您的 FormData 对象。这对我来说似乎是多余且低效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多