0

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

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 时,它都显示文件数据从未真正发送过。这是因为它太大了,还是什么?谢谢!

4

1 回答 1

0

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

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

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

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

于 2013-04-05T14:09:38.177 回答