Vuetify文件上传

时间:2018-10-04 11:16:09

标签: html vue.js file-upload vuetify.js

我正在尝试使用vuetify在Vue.js中上传文件,然后将上传的文件保存在我的数据对象中。

HTML:

<input id="file-upload" type="file" @change="onFileChange">

在我的方法中,我调用:

onFileChange(e) {

  var files = e.target.files || e.dataTransfer.files;
  if (!files.length) {
    return;
  }   
  this.editedPerson.id_file = e.target.files[0].name;
},

这有效100%。

但是,我确实想使用Vuetify组件:

<v-btn color="blue-grey" class="white--text" @click.native="openFileDialog">Upload<v-icon right dark>cloud_upload</v-icon></v-btn>

我隐藏了原始文件输入标签,但是在此v-btn组件上,我调用了以下方法:

openFileDialog() {
  document.getElementById('file-upload').click();
},

因此,当我单击v-btn组件时,它模拟了对隐藏文件输入标签的单击,因此我可以选择一个文件。

更改输入标签后,我仍然可以console.log上传的文件,但是

this.editedPerson.id_file = e.target.files[0].name;

不再有效。

有什么原因会发生这种情况吗?

2 个答案:

答案 0 :(得分:2)

以下代码对我来说很好用。我已经将axois用于HTTPClient,您可能会选择

<div id="app">
   <v-btn color="blue-grey" class="black--text" @click.native="openFileDialog">
    Upload
    <v-icon right dark> cloud_upload</v-icon>
   </v-btn>
   <input type="file" id="file-upload" style="display:none" @change="onFileChange">
</div> 


Vue.use(Vuetify);
var vm = new Vue({
    el: "#app",
    data: {
        formData: new FormData(),
    },
    methods: {
        openFileDialog() {
            document.getElementById('file-upload').click();
        },
        onFileChange(e) {
            var self = this;
            var files = e.target.files || e.dataTransfer.files;       
            if(files.length > 0){
                for(var i = 0; i< files.length; i++){
                    self.formData.append("file", files[i], files[i].name);
                }
            }   
        },
        uploadFile() {
            var self = this; 
            axios.post('URL', self.formData).then(function (response) {
                console.log(response);
            }).catch(function (error) {
                console.log(error);
            });
        },
    },

});

答案 1 :(得分:0)

以下代码对我有用。
前端:vue + vuetifyjs +打字稿

<template>
  <v-container>
    <v-file-input multiple label="File input" @change="selectFile"></v-file-input>
    <v-btn @click="upload">Upload</v-btn>
  </v-container>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import Axios from 'axios'

@Component({
  components: {}
})
export default class LogDecode extends Vue {
  currentFile = ''

  selectFile (file: any): void {
    this.currentFile = file[0]
  }

  upload (): void {
    const formData = new FormData()
    formData.append('file', this.currentFile)

    Axios.post('/upload', formData)
      .then(response => {
        console.log({ response })
      }).catch(error => {
        console.log({ error })
      })
  }
}
</script>

服务器端:Golang +杜松子酒

func uploadFile(c *gin.Context) {
    log.Println("upload...")
    file, header, err := c.Request.FormFile("file")
    if err != nil {
        fmt.Println(err)
        c.String(http.StatusBadRequest, "Bad request")
        return
    }

    filename := header.Filename
    fmt.Println(file, err, filename)
    
    out, err := os.Create(filename)
    if err != nil {
        log.Fatal(err)
    }

    defer out.Close()
    
    _, err = io.Copy(out, file)
    if err != nil {
        log.Fatal(err)
    }

    c.String(http.StatusCreated, "upload successful \n")
}