【问题标题】:Laravel4 File Upload via XMLHttpRequest2通过 XMLHttpRequest2 上传 Laravel4 文件
【发布时间】:2015-03-01 20:34:36
【问题描述】:

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

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-ish 方式操作文件,以便能够

$file->guessExtension();

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

等等。但是php对待

$file = $_FILES['SelectedFile'];

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

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

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 你为什么不用jQuery的$.ajax?
  • @RoboRobok,我试过了,但无法从中获得进度(加载):(
  • @Antor,实际上我也用 Laravel 开发了我的上传器 :) Input::file 对我来说很好用。如果您有任何问题,我可以帮助您。

标签: javascript php jquery laravel xmlhttprequest


【解决方案1】:

以下是使用 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;
    }
});

【讨论】:

  • 谢谢!在您发表评论后,我进行了一些挖掘并执行了以下 ajax: $.ajax({ type: "POST", url: "/import", data: data, cache: false, processData: false, contentType: 'multipart/form -data',成功:函数(响应){console.log(响应);},xhr:函数(){var xhr =新窗口.XMLHttpRequest();xhr.upload.addEventListener(“进度”,函数(e) { // e.loaded 和 e.total }, false); return xhr; } });
  • $.ajaxSettings.xhr()new window.XMLHttpRequest() 更可靠。
猜你喜欢
  • 2014-06-07
  • 2014-02-25
  • 2013-08-23
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2012-04-26
相关资源
最近更新 更多