Laravel4 通过 XMLHttpRequest2 上传文件

Laravel4 File Upload via XMLHttpRequest2

我是初学者到中级程序员,遇到了以下问题(真的,通过搜索找不到任何东西):

Laravel 4 使用以下算法来处理通过提交表单上传的文件:

$file = Input::file('foo');
...

我正在通过 XMLHttpRequest2 发送多个文件,并能够监控每个文件的进度。这是示例:

HTML

<div class="div-files">
    <input type="file" class="input-files" multiple>
    <button class="btn-upload">Upload</button>
</div>

JavaScript

$(document).ready(function(){
    $(".btn-upload").click(function(){
        var files = $(".input-files")[0].files,
            div_files = $(".div-files");
        if (files.length == 0) {
            return false;
        } else {
            $(files).each(function(key, val) {
                div_files.append("<p>" + val.name + " <progress data-id=\"" + key + "\" value=\"0\" max=\"100\"></progress></p>")
                var data = new FormData(),
                    request = new XMLHttpRequest();
                data.append("SelectedFile", val);
                request.onreadystatechange = function() {
                    if (request.readyState == 4) {
                        console.log(request.response);
                    }
                }
                request.upload.addEventListener("progress", function(e) {
                    $("progress[data-id=\"" + key + "\"]").val(Math.floor(100*e.loaded/e.total));
                }, false);
                request.open("POST", "/import");
                request.send(data);
            });
        }
    });
});

PHP

$file = $_FILES['SelectedFile'];
if ($file['error'] > 0) {
    return Response::json(array('status' => 'error', 'data' => 'An error occurred while uploading.'));
}
...

问题是我想以类似 Laravel 的方式操作文件,以便能够

$file->guessExtension();

$file->move($destinationPath, $fileName);

等等。但是 php 对待

$file = $_FILES['SelectedFile'];

作为另一个实例,我无法通过

获取
$file = Input::file('SelecteFile');

如有任何帮助,我们将不胜感激。谢谢。

以下是使用 jQuery 跟踪进度的方法:

$.ajax({
    // ...
    cache: false,
    processData: false,
    contentType: false,
    xhr: function () {
        var result = {};

        result = $.ajaxSettings.xhr();

        if (typeof result.upload === "object") {
            result.upload.addEventListener(
                "progress",
                function (e) {
                    if (e.lengthComputable) {
                        // here you have e.loaded and e.total
                    }
                },
                false
            );
        }

        return result;
    }
});