Laravel 使用 vue3 上传文件

Posted

技术标签:

【中文标题】Laravel 使用 vue3 上传文件【英文标题】:Laravel uploading file using vue3 【发布时间】:2022-01-12 06:02:21 【问题描述】:

我正在尝试使用 vue3 组合 API 在 Laravel 存储文件夹中上传文件。我已添加代码,但文件未上传。

路由正确,只有 null 值被添加到 mysql 中。

我在 mysql 数据库中有 3 列。

id | file_name | file_path

html

 <input    ref="file" v-on:change="handleFileUpload()"  type="file" />

 <button @click="senddata" class="">UPLOAD</button>

Vue函数:

<script>
import axios from "axios";
import  defineComponent,ref  from 'vue'
export default defineComponent(
  setup() 

      const file = ref(null)
     const handleFileUpload = async() => 
           // debugger;
            console.log("selected file",file.value.files)
            //Upload to server
        


function senddata() 
    
     axios.post('http://127.0.0.1:8000/api/store-files',
     file:this.file,
     
      ).then(response=>
      message=response.data.message; 
      alert(message);

      );


    return 
        senddata,
        handleFileUpload,
        file
    ;

)
</script>

Laravel 商店控制器:

 public function store(Request $request)
    
 $file=new Files();
  if($request->file()) 
            $file=new Files();
             $file_name = time().'_'.$request->file->getClientOriginalName();
             $file_path = $request->file('file_link')->storeAs('uploads', $file_name, 'public');
 
             $file->file_name = time().'_'.$request->file->getClientOriginalName();
             $file->file_path = '/storage/' . $file_path;
             $file->save();
             return response()->json([
                'message' => 'File  added'
            ]);
        

【问题讨论】:

【参考方案1】:

你不能以json格式发送文件,你需要通过FormData发送

你需要编写类似的代码

html

 <input    ref="file" v-on:change="handleFileUpload"  type="file" />

 <button @click="senddata" class="">UPLOAD</button>

Vue函数


handleFileUpload() 
   const file = ref(null)
   this.file = file.value.files;



function senddata() 
    
   let formData = new FormData();
   formData.append('file',file)

     axios.post('http://127.0.0.1:8000/api/store-files',formData).then(response=>
      message=response.data.message; 
      alert(message);

      );

参考链接https://developer.mozilla.org/en-US/docs/Web/API/FormData

【讨论】:

Thankoyu,我还需要在 html 中添加
吗?希望 laravel 控制器没有问题。
javascript中不需要new FromData 错误:无法读取未定义的属性(读取“目标”) v-on:change="handleFileUpload" 这里我删除了() 请检查 在 vue 代码下,handleFileUpload(e) ,"expected semicolon after (e)" 如果我​​在 (e) 之后添加分号,则会显示错误;它说 e 没有定义。

以上是关于Laravel 使用 vue3 上传文件的主要内容,如果未能解决你的问题,请参考以下文章

vue3+typescript上传文件到七牛云

如何修复“文件上传失败。”使用任何图像上传验证时出错 - Laravel 5.7

如何使用 vuejs 和 laravel 使用块方法上传大文件?

Laravel 5.0 文件上传验证

Laravel 5 文件上传验证

Vue3Ant-Design 文件上传