Laravel 5中的远程URL上传

时间:2019-01-05 19:18:23

标签: php ajax laravel laravel-5

我正在尝试创建一个网站来上传Laravel中的文件,但是我不能:(,如果我使用不带框架的PHP,一切正常,但是有了它(Laravel),我会收到错误消息,那是问题。

这是我的代码:

<form id="remote_upload" method="POST">
      @csrf 
      <input name="url" id="url" type="url" />
      <input name="upload" id="upload" type="submit" />
</form>

我的AJAX代码:

$(document).ready(function(){

 $('#remote_upload').on('submit', function(event){
    event.preventDefault();
    $.ajax({
     url: "{{ route('remote_upload') }}",
     method:"POST",
     data: new FormData(this),
     // IF WE HAVE ANY FUNCTION TO SET UPLOAD PROGRESS FOR REMOTE UPLOAD - PLEASE TELL ME :) 
     xhr: function() {
          var myXhr = $.ajaxSettings.xhr();
          if(myXhr.upload){
              myXhr.upload.addEventListener('progress', progressHandlerHome, false);
              myXhr.addEventListener("load", completeHandlerHome, false);
              myXhr.addEventListener("error", errorHandlerHome, false);
              myXhr.addEventListener("abort", abortHandlerHome, false);
          }
          return myXhr;
      },
     dataType:'JSON',
     contentType: false,
     cache: false,
     processData: false,
     // IF SUCCESS
     success:function(data)
     {
        $('.result').html(data.link);
     }
  });
 });

});

这是我的控制器:

protected function remote_upload(Request $request) {
        $file = file_get_contents($request->url_file);

        // UPLOAD FILE
        if (getValue('storage_type', 'disk') == 's3') {
            $path = Storage::disk('s3')->putFile('files', $file);
            $storage = 's3';
        } else {
            $path = Storage::putFile('files', $file);
            $storage = 'disk';
        }

        return response()->json([
            'link' => $path
        ]);
    }

我不知道我们是否有一个软件包可以从Laravel中的URL上传文件:)

  

注意:关于上传验证(检查URL,是否具有SSL ...),我会这样做,但是希望您能看到我,如何添加上传进度,实际大小文件的名称及其原始名称仅通过URL,在上传之前:)

谢谢

2 个答案:

答案 0 :(得分:1)

假设您从ajax FormData对象中获取了正确的数据,则只需执行以下操作:

public function store(Request $request)
{
    $imgLocation = Storage::disk('public')->put("imagename", $request->file('image'));

    ...
}

这会将图像本地保存到您的laravel项目中,您可能需要为Amazon s3编辑它,但应该类似。

如果您想通过网址上传图片,可以尝试执行以下操作:

public function store(Request $request) {
      $url = $request->image;
      $contents = file_get_contents($url);
      $name = substr($url, strrpos($url, '/') + 1);
      Storage::disk('s3')->putFile($name, $contents);
      ...
}

答案 1 :(得分:0)

您只需像这样使用 Storage

protected function remote_upload(Request $request) {
    $file = $request->url_file;

    // UPLOAD FILE
    if (getValue('storage_type', 'disk') == 's3') {
        $path = Storage::disk('s3')->putFile('files', $file);
        $storage = 's3';
    } else {
        $path = Storage::putFile('files', $file);
        $storage = 'disk';
    }

    return response()->json([
        'link' => $path
    ]);
}