【问题标题】:How To Use FormData() For Uploading File In VueVue中如何使用FormData()上传文件
【发布时间】:2019-04-28 05:03:55
【问题描述】:

所以我之前问过一个问题,并在logging 结果方面得到了一点帮助,但是我的结果没有意义。

所以我有意见

<input type="file" name="import_file" v-on:change="selectedFile($event)">

v-on:change将选中的文件绑定到我的数据对象this.file

selectedFile(event) {
      this.file = event.target.files[0]
    },

然后我用这个方法提交文件

uploadTodos() {
  let formData = new FormData();
  formData.append('file', this.file);
  for(var pair of formData.entries()) {
    console.log(pair[0]+ ', '+ pair[1]); 
   }
   this.$store.dispatch('uploadTodos', formData);
 }

但是,当我提交时,formData 似乎没有附加数据,因为我的logged 结果是这样的

file, [object File]

我不应该将我的实际数据附加到formData 对象吗??

我参考了其他关于如何发布的文章,但我没有得到想要的结果。

article 1 article2

uploadTodos(context, file) {
      console.log(file)
      axios.post('/import', file,{ headers: {
        'Content-Type': 'multipart/form-data'
      }})
      .then(response => {
        console.log(response.data)
        context.commit('importTodos', response.data)
      })
      .catch(error => {
        console.log(error.response.data)
      })
    }

当我console.log(file) formData 对象为空时

后端问题 所以我在后端使用 Laravel 的问题在于 maatwebsite 包。从我看到的是 3.0 版本还不支持导入。建议的唯一解决方法是安装 2.0 版?这仍然是唯一的解决方法吗?这是控制器方法

public function importExcel(Request $request) 
    {

        if (empty($request->file('file')->getRealPath())) {
            return back()->with('success','No file selected');
        }
        else {
        $path = $request->file('file')->getRealPath();
        $inserts = [];
        Excel::load($path,function($reader) use (&$inserts)
        {
            foreach ($reader->toArray() as $rows){
                foreach($rows as $row){
                    $inserts[] = ['user_id' => $row['user_id'], 'todo' => $row['todo']];
                };
            }
        });

        if (!empty($inserts)) {
            DB::table('todos')->insert($inserts);
            return back()->with('success','Inserted Record successfully');                  
        }


        return back();
        }

    }

3.0版不支持的行是这样的

Excel::load($path,function($reader) use (&$inserts)

【问题讨论】:

  • 一个File封装了数据。 developer.mozilla.org/en-US/docs/Web/API/File
  • 您到底想达到什么目标,您遇到的错误是什么?
  • @MazinoSUkah,我正在尝试使用this.$store.dispatch('uploadTodos', formData); 提交我的表单数据对象,但是我的vuex 方法uploadTodos 不包含任何数据。请查看vuex 方法的更新问题
  • @RoyJ,当我 console.log(pair) 它显示 formData 对象的内容但是一旦它到达我的 vuex 方法它似乎是空的......

标签: vue.js file-upload axios form-data


【解决方案1】:

这篇文章回答了问题的第二部分。起初从我读到的maatwebsite/excel version 3.0 不支持导入。但是我使用的是支持导入的 version 3.1.0。但是导入的方法仍然不支持Excel::load()。您应该改用Excel::import() 并遵循给定的参数传递规则。当然可以根据您的需要进行修改。但无论如何,这里是一个简单的例子,说明我如何为任何感兴趣的人使用它。

首先为任何模型创建导入文件。对我来说是 Todos。

<?php

namespace App\Imports;

use App\Todo;

use Maatwebsite\Excel\Concerns\ToModel;

class TodoImport implements ToModel
{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new Todo([
            'user_id'  => $row[0],
            'todo'     => $row[1],
        ]);
    }
}

接下来你让控制器处理文件,并将其传递给 todosimport 文件

 public function importExcel(Request $request) 
    {

        if (empty($request->file('file')->getRealPath())) {
            return back()->with('success','No file selected');
        }
        else {
        Excel::import(new TodoImport, $request->file('file'));

        return response('Import Succesful, Please Refresh Page');
        }

    }

注意Excel::import()。我传入新的 Todo 模型和收到的文件。

当然对我来说,因为我是通过 ajax 来做的,所以我使用这条路由来 ping 方法

Route::post('/import', 'TodosController@importExcel');

【讨论】:

    【解决方案2】:

    我已经复制了你的代码,它似乎工作正常

    当我 console.log(file) 时 formData 对象为空

    是的,当您进行控制台时,输出应该是一个空对象,这就是 javascript 的工作方式。

    将输出转换为数组后,我得到下图中的输出:

    const store = new Vuex.Store({
      actions: {
        uploadTodos(context, file) {
          console.log([...file])
          axios.post('/import', file,{ headers: {
            'Content-Type': 'multipart/form-data'
          }})
          .then(response => {
            console.log(response.data)
            context.commit('importTodos', response.data)
          })
          .catch(error => {
            console.log(error.response.data)
          })
        }
      }
    })
    
    const app = new Vue({
    	store,
      data: {
      	file: null
      },
      methods: {
      	selectedFile(event) {
      	    console.log(event);
      	      this.file = event.target.files[0]
      	    },
        uploadTodos() {
      		let formData = new FormData();
      		formData.append('file', this.file);
      		for(var pair of formData.entries()) {
        		console.log(pair[0]+ ', '+ pair[1]); 
       		}
       		this.$store.dispatch('uploadTodos', formData);
     		}
      },
      el: '#app'
    })
    <script src="https://unpkg.com/vue"></script>
    <script src="https://unpkg.com/vuex"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <div id="app">
      <input type="file" name="import_file" @change="selectedFile($event)">
      <button @click="uploadTodos">
       Submit 
      </button>
    </div>

    【讨论】:

    • 是的,我现在得到了相同的结果。我想我在后端接收到的数据有问题。感谢您的帮助!
    • 不客气..您在后端使用什么语言/框架?
    • Laravel 5.6。我添加了 maatwebsite 包,所以我可以上传 excel 文件,但是当我到达我的控制器方法时,我做错了。有经验吗?
    • 我有使用 laravel 的经验...您能否更新您的问题,显示您为 laravel 后端所做的尝试?
    • 请参阅我对maatwebsit/excel 问题的回答帖子。事实证明它确实支持导入。
    猜你喜欢
    • 2017-08-30
    • 2012-03-26
    • 2021-03-05
    • 2018-04-15
    • 2020-06-04
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多