尝试使用 AJAX 在 Laravel 中上传单个文件时出现数组到字符串转换错误

Posted

技术标签:

【中文标题】尝试使用 AJAX 在 Laravel 中上传单个文件时出现数组到字符串转换错误【英文标题】:Array to String conversion error while trying to do a single file upload in Laraver using AJAX 【发布时间】:2021-12-16 20:22:01 【问题描述】:

我的表单通过 AJAX 提交一个文件和某些文本,唯一的问题是通过 AJAX 上传文件。表单数据正在通过 FormData 实例提交,但在尝试保存文件时出现数组到字符串的转换错误。 我附上下面的脚本。

控制器:

public function store(Request $request)
    
        $request->validate([
            'name' => 'required',
            'contact_number' => 'required|numeric',
            'email' => 'required', 
            'total_exp' => 'required|numeric',
            'skillsets' => 'required',
            'current_organization' => '',
            'remarks' => '',
            'file_name' => 'required|max:2048'
        ],
        [   
            'name' => 'This field is mandatory',
            'contact_number' => 'This field is mandatory',
            'email' => 'This field is mandatory', 
            'total_exp' => 'This field is mandatory',
            'skillsets' => 'This field is mandatory',
            'total_exp.numeric' => 'Only numberic values allowed',
            'contact_number.numeric' => 'Only numberic values allowed'
        ]);

        //try
        $career = CareerForm::updateOrCreate([
            'name'=>$request->name,
            'contact_number'=>$request->contact_number,
            'email'=>$request->email,
            'total_exp'=>$request->total_exp,
            'skillsets'=>$request->skillsets,
            'current_organization'=>$request->current_organization,
            'remarks'=>$request->remarks,
            'file_name' => $request->file_name,
            ]);
        
        //if(request()->hasFile('file_name'))
        
        $file=$request->file('file_name');
        $fname = rand().'.'.$file('file_name')->getClientOriginalName().'.'.$file('file_name')->getClientOriginalExtension();
        $file->move(public_path('documents'),$fname);
        //$file->move(public_path('uploads'), $fname);
            //$request->file->move(public_path('uploads'), $fileName);*/
        /*$file = $request->file('file_name')->store('public/documents');
        Storage::disk('local')->put($request->file($request->file)->getClientOriginalName(), 'Contents');*/
        //catch(Exception $e1)echo $e1;
        return response()->json([
            "success" => true,
            
        ]);

查看:

@extends('layouts.app')

@section('content')

<h2>Career Form using AJAX</h2>
<form class="form-signin" id="form_todo"  enctype="multipart/form-data">
  <h1 class="h3 mb-3 font-weight-normal">Career Form</h1>
  <label for="inputEmail" class="sr-only">Name</label>
  <input name="name" type="text" id="inputName" class="form-control" placeholder="Name" required="" autofocus="">
  @error('name')
  <div class="text-red-500 mt-2 text-sm">
    $message
  </div>
  @enderror
  <label for="" class="sr-only">Contact Number</label>
  <input name="contact_number" type="" id="c_n" class="form-control" placeholder="Contact Number" required="" autofocus="">
  @error('contact_number')
  <div class="text-red-500 mt-2 text-sm">
    $message
  </div>
  @enderror
  <label for="" class="sr-only">Email</label>
  <input name="email" type="text" id="eml" class="form-control" placeholder="Email" required="" autofocus="">
  @error('email')
  <div class="text-red-500 mt-2 text-sm">
    $message
  </div>
  @enderror
  <label for="" class="sr-only">Total Experience</label>
  <input name="total_exp" type="" id="exp" class="form-control" placeholder="Total Experience" required="" autofocus="">
  @error('total_experience')
  <div class="text-red-500 mt-2 text-sm">
    $message
  </div>
  @enderror
  <label for="" class="sr-only">Skillsets</label>
  <input name="skillsets" type="text" id="skl" class="form-control" placeholder="Skillsets" required="" autofocus="">
  @error('skillsets')
  <div class="text-red-500 mt-2 text-sm">
    $message
  </div>
  @enderror
  <label for="" class="sr-only">Curent Organization</label>
  <input name="current_organization" type="text" id="c_o" class="form-control" placeholder="Current Organizations (Optional)" autofocus="">
  @error('current_organization')
  <div class="text-red-500 mt-2 text-sm">
    $message
  </div>
  @enderror
  <label for="" class="sr-only">Remarks</label>
  <input name="remarks" type="text" id="rem" class="form-control" placeholder="Remarks (Optional)" autofocus="">
  @error('remarks')
  <div class="text-red-500 mt-2 text-sm">
    $message
  </div>
  @enderror

  
  <input type="file" id="file_id" name="file_name[]" class="form-control">
  <!--<button type="button" id="btnFile" class="btn btn-primary">Submit File</button>-->
  
  <button class="btn  btn-primary btn-block" id="career_btn" type="submit">Submit</button>

</form>


<p class="mt-5 mb-3 text-muted">Done by Debajyoti Das</p>


<script type="text/javascript">
  $(document).ready(function() 
    $.ajaxSetup(
      headers: 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
      

    );
  );
    $("#form_todo").on('submit',function(e) 
    //$("#career_btn").click(function(e) 

      e.preventDefault();
      //var formData = new FormData($(this)[0]);
      //var files = $("#file_id")[0].files;
      var formData = new FormData(this);
      //formData.append('file_id',files[0]);

      $.ajax(
        type: 'POST',
        url: "career/store",
        data: formData,
        datatype: 'JSON',
        contentType: false,
        cache: false,
        processData: false,
        success: function(data) 
        
      );
    );
  
</script>

@endsection

JSON 错误信息:数组到字符串的转换 任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

在您的服务器上,您已经接受了一系列文件。

$files=$request->file('file_name');
foreach ($files as file) 
        $fname = rand().'.'.$file->getClientOriginalName().'.'.$file->getClientOriginalExtension();
        $file->move(public_path('documents'),$fname);


【讨论】:

做了以下但同样的错误。附上以下代码: $files=$request->file('file_name'); foreach($files as $file) $fname = rand().'.'.$file->getClientOriginalName().'.'.$file->getClientOriginalExtension(); $file->move(public_path('documents'),$fname); 我认为这是处理数组的正确方法。检查您的代码逻辑可能您的本地存储有问题并检查 laravel.log 文件以获取错误异常。

以上是关于尝试使用 AJAX 在 Laravel 中上传单个文件时出现数组到字符串转换错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery Ajax 将单个对象传递给 MVC 控制器方法

如何使用 Xampp 作为 localhost 在大于 2mb 的 wordpress 中上传主题

Laravel 为单个项目上传多个文件并进行验证

使用 Laravel 在 Azure 中来自单个请求的多个重复 HTTP 请求/查询

在 S3 中上传输入流块后无法解压缩 gzip 文件

如何将视图中的数组传递给 ajax 并在 Laravel 5 的控制器中访问?