【问题标题】:Image upload not working through ajax Laravel图片上传无法通过 ajax Laravel
【发布时间】:2017-12-20 11:12:36
【问题描述】:

有一个奇怪的问题,我确信这与我的脚本获取文件输入字段值的方式有关。

我知道控制器功能有效,因为我已经能够通过手动提交表单而不使用 ajax 来做到这一点。

我也知道 ajax 在发送和接收请求时有效,因为我通过修改它来来回解析一个有效的字符串来测试它。

此外,我可以看到脚本正在抓取文件,因为当我选择文件时,它会在控制台中显示所选文件。

在我的浏览器中出现 500 错误,而在 Laravel 中我只得到这个:

Symfony\Component\Debug\Exception\FatalThrowableError: 在 C:\123\app\Http\Controllers\MyController.php:156 中的字符串上调用成员函数 getClientOriginalExtension()

我尝试将控制器更新为使用 Request->logo,但没有成功。

查看:

<form enctype="multipart/form-data" class="form-horizontal" method="POST" action="{{ url('studio/uploadLogo') }}">
    {{ csrf_field() }}
    <div class="form-group{{ $errors->has('studioname') ? ' has-error' : '' }}">            
                <label for="imageInput" class="col-md-4 control-label">Logo</label>
                <div class="col-md-6">
                    <input data-preview="#preview" name="logo" type="file" id="imageInput">
                    <img id="preview" src="" style="display: none"></img>
                    <input class="form-control" type="submit">
                </div>
            </div>
        </form>

脚本:

$('#imageInput').change(function (e) {
    e.preventDefault();
    var logo = $('#imageInput').val();
    console.log(logo);
    $.ajax({
        type: "POST",
        url: '/studio/uploadLogo',
        data: {logo: logo},
        success: function( data ) {
            console.log(data);
        }
    });
}); 

控制器:

public function uploadLogo() {
    $file = Input::file('logo')->getRealPath();
    $photoName = str_random(20) . '.' . Input::file('logo')->getClientOriginalExtension();
    Input::get('logo')->move(public_path('avatars'), $photoName);
    $response = array(
        'status' => 'success',
        'data' => $photoName
    );
    return \Response::json($response);
}

路线:

 Route::post('/studio/uploadLogo', 'MyController@uploadLogo');
 Route::get('/studio/uploadLogo', 'MyController@uploadLogo');

【问题讨论】:

  • 检查 url 路径是否正确。 url: '/studio/uploadLogo',
  • 更新帖子以包括路线@BilalAhmed
  • 您可以通过这种替代方式获取文件扩展名。(即stackoverflow.com/questions/38403558/…)
  • 我认为不对,您的链接用于获取已上传的文件 - 我无法处理上传。
  • 在您的 uploadLogo() 函数中删除所有代码并返回成功消息并让我知道您是否能够获得成功消息?

标签: javascript php ajax laravel


【解决方案1】:

        You just change a view js script to submit like below
         $('.form-horizontal').submit(function(event){
            event.preventDefault();
            $.ajax({
                type        : 'POST',
                url         : "/studio/uploadLogo", 
                data        : new FormData(this),
                contentType:false,
                processData:false,
            })
            .done(function(data,status){
                 //Your codes here
             });
        });


        and
        echo string response from controller like below
    ----------------
          $file=$request->file('logo');
          $uploaded_file_path='';
          if($file!=null) {
              $destinationPath = 'uploads';
              $uploaded=$file->move($destinationPath,$file->getClientOriginalName());  
              $uploaded_file_path= $uploaded->getPathName();
               $response = array(
                    'status' => 'success',
                    'data' => $uploaded_file_path
                );
          }else{
              $response = array(
                  'status' => 'failed',
                  'data' => $uploaded_file_path
              );          
          }     
         echo json_encode($response);
    ----------------

【讨论】:

    【解决方案2】:

    在你的控制器中试试这个

    public function uploadLogo() {
        $file = Input::file('logo')->getRealPath();
        $photoName = str_random(20) . '.' . Input::file('logo')->getClientOriginalExtension();
        Input::file('logo')->move(public_path('avatars'), $photoName);
        $response = array(
            'status' => 'success',
            'data' => $photoName
        );
        return \Response::json($response);
    }
    

    你已经给了

    输入::get('logo')->move(public_path('avatars'), $photoName);

    请改成

    输入::file('logo')->move(public_path('avatars'), $photoName);

    你应该像@jalin评论(https://stackoverflow.com/a/47906201/4049692)一样从ajax提交表单

    希望这应该是问题所在。 谢谢!

    【讨论】:

      【解决方案3】:

      尝试在您的脚本代码中添加processData: false, contentType: false

      $('#imageInput').change(function (e) {
      e.preventDefault();
      var logo = $('#imageInput').val();
      var form_data = new FormData();
      form_data.append("logo",$("#imageInput")[0].files[0]);
      console.log(logo);
      $.ajax({
          type: "POST",
          url: '/studio/uploadLogo',
          data: {form_data},
          cache : false,
          processData: false,
          contentType: false
          success: function( data ) {
              console.log(data);
          }
      });
      }); 
      

      并尝试在控制器中获取值,例如 $request-&gt;logo

      请参考我的答案enter link description here

      【讨论】:

      • 感谢建议,按建议调整,没有成功。
      • 我认为你需要 formData().. 现在试试我的答案
      • 请注意您的编辑有一个错误:data: {formData} 应该是 data: {form_data} 但仍然没有工作。
      猜你喜欢
      • 2019-11-06
      • 2014-07-12
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多