Подтвердить что ты не робот

Загрузка файла в vuetify

Я использую компоненты vuetify для front-end в Vuejs. Я хочу создать форму регистрации пользователя с загрузкой файла. Я могу создать форму, используя v-text-field в vuetify, но как загрузить файл. Какой компонент использовать или любым другим альтернативным способом.

4b9b3361

Ответ 1

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 = ''
			}
		}
    }

})
<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>

Ответ 2

Это то, что мы добавим в будущем, но не в настоящее время. Существует обсуждение github с несколькими пользователями, публикующими их реализации, которые они используют в настоящее время, https://github.com/vuetifyjs/vuetify/issues/238

Ответ 3

Простой трюк:

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

Просто создайте вход со следующими свойствами:

  • type=file
  • ref=inputUpload это работает как идентификатор, вы можете назвать его так, как хотите
  • v-show=false это скрывает ввод

Затем создайте кнопку, которая при нажатии на нее запускает событие щелчка на входной кнопке загрузки.

Ответ 4

Хорошие новости.

Начиная с версии 2.0.0. -beta.8 v-file-input доступна в Vuetify. Вы должны использовать это как:

<template>
  <v-file-input accept=".txt" label="Select File..."></v-file-input>
</template>

ОБНОВЛЕНИЕ (ДОПОЛНЕНИЕ ПО SNIPPET):

Основное использование для обработки файла изображения может быть реализовано следующим образом:

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)
    }
  }
})
<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/[email protected]/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/vuetify.min.css" rel="stylesheet">

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/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>