AJAX / Laravel多文件上传

时间:2017-03-13 01:51:16

标签: php jquery laravel upload

我正在尝试使用jQuery / AJAX / Laravel从拖放事件上传多个文件。

MY DROP EVENT:

$( document ).on('drop dragleave', '.file-drag', function(e){
    $(this).removeClass('drop-ready');
    if(e.originalEvent.dataTransfer.files.length) {
      e.preventDefault();
      e.stopPropagation();

      if (e.type === "drop") {
      var files = e.originalEvent.dataTransfer.files;
      AjaxFileUpload(files)
      }
    }
  });

我的上传脚本:

function AjaxFileUpload(files){
    console.log(files);

    //Start appending the files to the FormData object.
    var formData = new FormData;
    formData.append('_token', CSRF_TOKEN);
    for(var i = 0; i < files.length; i++){
      formData.append(files[i].name, files[i])
    }

    console.log(formData.entries());

    $.ajax({
        //Server script/controller to process the upload
        url: 'upload',
        type: 'POST',

        // Form data
        data: formData,

        // Tell jQuery not to process data or worry about content-type
        // You *must* include these options!
        cache: false,
        contentType: false,
        processData: false,
        // Error logging
        error: function(jqXHR, textStatus, errorThrown){
          console.log(JSON.stringify(jqXHR));
          console.log('AJAX Error: ' + textStatus + ": " + errorThrown);
        },
        // Custom XMLHttpRequest
        xhr: function() {
            var myXhr = $.ajaxSettings.xhr();
            if (myXhr.upload) {
                // For handling the progress of the upload
                myXhr.upload.addEventListener('progress', function(e) {
                    if (e.lengthComputable) {
                        $('progress').attr({
                            value: e.loaded,
                            max: e.total,
                        });
                    }
                } , false);
            }
            return myXhr;
        },
        success: function(data){
          console.log(data);
        }
    });
  }

MY CONTROLLER CODE:

class UploadsController extends Controller
{
    public function UploadFiles(Request $request){
      return $request->all();
    }
}

我认为我的图像正在进入服务器端,因为当我返回请求对象时,我在控制台中获得以下内容:

enter image description here

因此,CSRF令牌正在通过,图像(我认为?)正在通过。我的问题是从PHP访问文件并通过 - &gt; store();。

存储它们

在无数的在线/文档示例中,它们通常使用以下内容:

$path = $request->photo->store('images');

但是,我不明白这个'照片'方面。如果上传视频或PDF怎么办?我基本上不明白我是如何访问请求对象的不同部分的。 Laravel网站上的文档非常稀疏,仅提供了一个使用“照片”的例子,它从未解释过。

3 个答案:

答案 0 :(得分:0)

关于Laravel文档中的示例,“照片”只是使用魔术方法来引用以“照片”名称上传的文件。您可以将“照片”替换为您的特定文件名。可以在here找到能够在您上传的文件中调用的特定功能。

答案 1 :(得分:0)

想出来。

在我的uploadscontroller中:

class UploadsController extends Controller
{
    public function UploadFiles(Request $request){
      $arr = [];
      foreach($request->all() as $file){
        if(is_file($file)){
          $string = str_random(16);
          $ext = $file->guessExtension();
          $file_name = $string . '.' .  $ext;
          $filepath = 'uploads/' . Auth::user()->username . '/' . $file_name;
          $file->storeAs(('uploads/' . Auth::user()->username), $file_name);
          array_push($arr, [$file_name, $filepath]);
        }

      }
      return $arr;
    }
}

答案 2 :(得分:0)

这花了我一段时间,但我终于得到了一个有效的解决方案。我使用Dropzone,因此getAcceptedFiles()返回文件对象列表,但它应该是相同的概念。我还将文件附加到现有表单。

上传

Could not complete request:org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.Error: **Problem loading Module.4**
Caused by:java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_131] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [rt.jar:1.8.0_131] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.8.0_131] at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_131]    ... 79 more
**Caused by: java.lang.SecurityException: Toolkit not encapsulated by a jar.**
    at com.rsa.jcm.f.hz.a(Unknown Source) [jcmFIPS-6.1.3.3.jar:6.1]
    at com.rsa.jcm.f.js.b(Unknown Source) [jcmFIPS-6.1.3.3.jar:6.1]
    at com.rsa.crypto.jcm.ModuleLoader.a(Unknown Source) [jcmFIPS-6.1.3.3.jar:6.1]
    at com.rsa.crypto.jcm.ModuleLoader.load(Unknown Source) [jcmFIPS-6.1.3.3.jar:6.1]
20:24:06,871 ERROR [com.utxfrmwk.util.ExceptionUtils] (http-CDCUDRIFDAPP1/10.40.18.113:3010-4) Exception raised: : java.lang.Error: Problem loading Module.4
    at com.rsa.cryptoj.o.by.f(Unknown Source) [cryptojcommon-6.1.3.3.jar:6.1.3.3]
    at com.rsa.cryptoj.o.by.c(Unknown Source) [cryptojcommon-6.1.3.3.jar:6.1.3.3]
    at com.rsa.cryptoj.o.cf.a(Unknown Source) [cryptojcommon-6.1.3.3.jar:6.1.3.3]
    at com.rsa.cryptoj.o.ce.b(Unknown Source) [cryptojcommon-6.1.3.3.jar:6.1.3.3]


Looking for your prompt support and cooperation's .
regards 


Ashish

<强>控制器:

var formElement = document.getElementById("addForm");
var formData = new FormData(formElement);
// Attach uploaded files to form submission
var files = myDZ.getAcceptedFiles();  // using Dropzone
for (var i = files.length - 1; i >= 0; i--) {
    formData.append('files[]', files[i]);
}

$.ajax({
    url: 'home/',
    data: formData,
    processData: false,
    contentType: false,
    timeout: 1000,
    type: 'POST',
    headers: {
        'X-CSRF-TOKEN': Laravel.csrfToken,
    },
    success: function(){
       ...
    },
    error: function (jqXHR, textStatus) {
      ...
    }
});

Dropzone脚本:

foreach($request->only('files') as $files){
    foreach ($files as $file) {
        if(is_file($file)) {    // not sure this is needed
            $fname = $file->getClientOriginalName();
            $fpath = $file->store('docs'); // path to file
        }
    }
}