文件上传vuetify

pra*_*lia 41 javascript frameworks vue.js vuetify.js

我在Vuejs中使用vuetify组件作为前端.我想创建一个带文件上传的用户注册表单.我可以v-text-field在vuetify中创建一个表单但是如何上传文件.使用哪个组件或任何其他替代方式.

Yub*_*tha 53

Vue JS直到今天还没有文件输入功能,因此您可以调整v-text-field以像图像输入字段一样工作.概念是,创建一个文件输入字段然后使用css隐藏它,并在v-text-field中添加一个事件来触发该特定文件输入字段以上传图像.我已经附上了片段,请玩那个,我也有一个使用vue和vuetify创建的小提琴,访问这里.谢谢!

new Vue({
    el: '#app',
    data: () => ({
        title: "Image Upload",
        dialog: false,
		imageName: '',
		imageUrl: '',
		imageFile: ''
    }),

    methods: {
        pickFile () {
            this.$refs.image.click ()
        },
		
		onFilePicked (e) {
			const files = e.target.files
			if(files[0] !== undefined) {
				this.imageName = files[0].name
				if(this.imageName.lastIndexOf('.') <= 0) {
					return
				}
				const fr = new FileReader ()
				fr.readAsDataURL(files[0])
				fr.addEventListener('load', () => {
					this.imageUrl = fr.result
					this.imageFile = files[0] // this is an image file that can be sent to server...
				})
			} else {
				this.imageName = ''
				this.imageFile = ''
				this.imageUrl = ''
			}
		}
    }

})
Run Code Online (Sandbox Code Playgroud)
<link href='https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons' rel="stylesheet">
  <link href="https://unpkg.com/vuetify/dist/vuetify.min.css" rel="stylesheet">

<div id="app">
    <v-app>
        <v-toolbar dark color="primary">
            <v-toolbar-side-icon></v-toolbar-side-icon>
            <v-toolbar-title class="white--text">{{ title }}</v-toolbar-title>
            <v-spacer></v-spacer>
            <v-btn icon @click="dialog = !dialog">
                <v-icon>link</v-icon>
            </v-btn>
        </v-toolbar>
		<v-content>
			<v-container fluid>
				<v-flex xs12 class="text-xs-center text-sm-center text-md-center text-lg-center">
					<img :src="imageUrl" height="150" v-if="imageUrl"/>
					<v-text-field label="Select Image" @click='pickFile' v-model='imageName' prepend-icon='attach_file'></v-text-field>
					<input
						type="file"
						style="display: none"
						ref="image"
						accept="image/*"
						@change="onFilePicked"
					>
				</v-flex>
				<v-dialog v-model="dialog" max-width="290">
					<v-card>
						<v-card-title class="headline">Hello World!</v-card-title>
						<v-card-text>Image Upload Script in VUE JS
							<hr>Yubaraj Shrestha
							<br>http://yubarajshrestha.com.np/</v-card-text>
						<v-card-actions>
							<v-spacer></v-spacer>
							<v-btn color="green darken-1" flat="flat" @click.native="dialog = false">Close</v-btn>
						</v-card-actions>
					</v-card>
				</v-dialog>
			</v-container>
		</v-content>
    </v-app>
</div>
  
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vuetify/dist/vuetify.js"></script>
Run Code Online (Sandbox Code Playgroud)


小智 29

这是我们将来会添加的内容,但目前尚未添加.github上讨论了几个用户发布他们暂时使用的实现,https://github.com/vuetifyjs/vuetify/issues/238


小智 27

一个简单的技巧是:

<v-btn color="success" @click="$refs.inputUpload.click()">Success</v-btn>
<input v-show="false" ref="inputUpload" type="file" @change="yourFunction" >
Run Code Online (Sandbox Code Playgroud)

只需创建具有以下属性的输入即可:

  • type=file
  • ref=inputUpload 这就像一个ID,您可以根据需要命名
  • v-show=false 这隐藏了输入

然后创建一个按钮,当您单击它时,它会在输入的“上载按钮”上触发单击事件。

  • 哈哈“这好像是在开玩笑”-我有点震惊,Vuetify没有覆盖文件输入,谢谢你的把戏:-) (2认同)
  • 很好的解决方案!谢谢你..只需要一个更新..`btn`上的`@click`需要是这样的:`$refs.inputUpload.$el.click()`只需要`$el`,它的工作原理如下冠军! (2认同)

vah*_*det 10

好消息。

Vuetify v-file-input中提供了从2.0.0.-beta.8版本开始的版本。您应该像这样使用它:

<template>
  <v-file-input accept=".txt" label="Select File..."></v-file-input>
</template>
Run Code Online (Sandbox Code Playgroud)

编辑(片段添加):

处理图像文件的基本用法可以实现如下:

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  data: () => ({
    file: null,
    imageUrl: null
  }),
  methods: {
    onFileChange() {
      let reader = new FileReader()
      reader.onload = () => {
        this.imageUrl = reader.result
      }
      reader.readAsDataURL(this.file)
    },
    onUpload() {
      console.log(this.file)
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@3.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">

<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>

<div id="app">
  <v-app>
    <v-content>
      <v-container>
        <v-file-input 
          v-model="file" 
          label="Select Image File..." 
          accept="image/*" 
          @change="onFileChange"
        ></v-file-input>
        <v-btn color="primary" @click="onUpload">Upload</v-btn>
      </v-container>
    </v-content>
  </v-app>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 如何将此文件发送到我的服务器? (2认同)