我正在创建一个网站,在那里用户可以张贴他们想卖的任何产品。它包括产品的标题、图片和描述。当我尝试将数据上传到firebase存储时,它不能很好地工作,并且显示"TypeError: Cannot read property 'files‘of undefined“。我应该修复哪个部分来解决这个问题?
<template>
<div class="productimageFile">
<div>
<label for="add-title">タイトル</label>
<input type='text' class="add-product-title" v-model="title">
</div>
<div>
<label for="add-picture">画像</label>
<div class="col-md-9">
<div class="customFile">
<input @change="photoFile" id="itemImage" type="file" accept=".jpg,.jpeg,.png,.gif, image/jpeg,image/png,image/gif"
class="custom-file-input" required>
<label id="add-item-image-label" class="custom-file-label" for="add-item-image">ファイルを選択</label>
</div>
</div>
</div>
<div>
<label for="add-description">説明</label>
<textarea class="discription" v-model="productDescription">説明記入欄</textarea>
</div>
<div>
<button @click='itemCreate' type="submmit" value="送信"></button>
</div>
</div>
</template>
<script>
import firebase from 'firebase'
export default {
name: 'ItemCreate',
data: function () {
return {
title: '',
itemImage: '',
productDescription: ''
}
},
methods: {
photoFile: function (e) {
e.preventDefault()
let files = e.target.files
this.productimageFile = files[0]
console.log(this.productimageFileductimage)
},
itemCreate: function () {
// 商品タイトル
const title = this.title
const productDescription = this.productDescription
const itemImage = this.itemImage
const { files } = itemImage[0]
if (files.length === 0) {
// ファイルが選択されていないなら何もしない
return
}
const file = files[0] // 表紙画像ファイル
const filename = file.name // 画像ファイル名
const itemImageLocation = `item-images/${filename}` // 画像ファイルのアップロード先
// TODO: 書籍データを保存する
firebase
.storage()
.ref(itemImageLocation)
.put(file) // Storageへファイルアップロードを実行
.then(() => {
// Storageへのアップロードに成功したら、Realtime Databaseに書籍データを保存する
const itemData = {
title,
itemImageLocation,
productDescription,
createdAt: firebase.database.ServerValue.TIMESTAMP
}
return firebase
.database()
.ref('items')
.push(itemData)
})
}
}
}
</script>
我是新来的,所以如果我做错了什么,请告诉我。非常感谢。
发布于 2020-06-20 11:41:07
Files是局部变量,请将其更改为全局变量!
示例:
<template>
<div class="productimageFile">
<div>
<label for="add-title">タイトル</label>
<input type='text' class="add-product-title" v-model="title">
</div>
<div>
<label for="add-picture">画像</label>
<div class="col-md-9">
<div class="customFile">
<input @change="photoFile" id="itemImage" type="file" accept=".jpg,.jpeg,.png,.gif, image/jpeg,image/png,image/gif"
class="custom-file-input" required>
<label id="add-item-image-label" class="custom-file-label" for="add-item-image">ファイルを選択</label>
</div>
</div>
</div>
<div>
<label for="add-description">説明</label>
<textarea class="discription" v-model="productDescription">説明記入欄</textarea>
</div>
<div>
<button @click='itemCreate' type="submmit" value="送信"></button>
</div>
</div>
</template>
<script>
import firebase from 'firebase'
var { files } = null
export default {
name: 'ItemCreate',
data: function () {
return {
title: '',
itemImage: '',
productDescription: ''
}
},
methods: {
photoFile: function (e) {
e.preventDefault()
let files2 = e.target.files
this.productimageFile = files2[0]
console.log(this.productimageFileductimage)
},
itemCreate: function () {
// 商品タイトル
const title = this.title
const productDescription = this.productDescription
const itemImage = this.itemImage
{ files } = itemImage[0]
if (files.length === 0) {
// ファイルが選択されていないなら何もしない
return
}
const file = files[0] // 表紙画像ファイル
const filename = file.name // 画像ファイル名
const itemImageLocation = `item-images/${filename}` // 画像ファイルのアップロード先
// TODO: 書籍データを保存する
firebase
.storage()
.ref(itemImageLocation)
.put(file) // Storageへファイルアップロードを実行
.then(() => {
// Storageへのアップロードに成功したら、Realtime Databaseに書籍データを保存する
const itemData = {
title,
itemImageLocation,
productDescription,
createdAt: firebase.database.ServerValue.TIMESTAMP
}
return firebase
.database()
.ref('items')
.push(itemData)
})
}
}
编辑:你也应该在你的命名约定上工作,有两个不同的变量命名为'files',这也可能是一个错误的原因。通过根据对象的功能或内容命名对象来保存您自己的错误。
发布于 2020-06-20 15:05:34
您不需要从itemCreate
方法中的输入元素获取文件,因为您已经在photoFile
处理程序中这样做了。
我稍微修改了一下你的代码。
<template>
<div class="productimageFile">
<div>
<label for="add-title">タイトル</label>
<input type='text' class="add-product-title" v-model="title">
</div>
<div>
<label for="add-picture">画像</label>
<div class="col-md-9">
<div class="customFile">
<input @change="photoFile" id="itemImage" type="file" accept=".jpg,.jpeg,.png,.gif, image/jpeg,image/png,image/gif"
class="custom-file-input" required>
<label id="add-item-image-label" class="custom-file-label" for="add-item-image">ファイルを選択</label>
</div>
</div>
</div>
<div>
<label for="add-description">説明</label>
<textarea class="discription" v-model="productDescription">説明記入欄</textarea>
</div>
<div>
<button @click='itemCreate' type="submmit" value="送信"></button>
</div>
</div>
</template>
<script>
import firebase from 'firebase'
export default {
name: 'ItemCreate',
data: function () {
return {
title: '',
itemImage: '',
productDescription: ''
}
},
methods: {
photoFile: function (e) {
e.preventDefault()
let files = e.target.files
this.productimageFile = files[0]
console.log(this.productimageFileductimage)
},
itemCreate: function () {
// 商品タイトル
const title = this.title
const productDescription = this.productDescription
const itemImage = this.productimageFile
if (!itemImage) {
// ファイルが選択されていないなら何もしない
return
}
const filename = itemImage.name // 画像ファイル名
const itemImageLocation = `item-images/${filename}` // 画像ファイルのアップロード先
// TODO: 書籍データを保存する
firebase
.storage()
.ref(itemImageLocation)
.put(itemImage) // Storageへファイルアップロードを実行
.then(() => {
// Storageへのアップロードに成功したら、Realtime Databaseに書籍データを保存する
const itemData = {
title,
itemImageLocation,
productDescription,
createdAt: firebase.database.ServerValue.TIMESTAMP
}
return firebase
.database()
.ref('items')
.push(itemData)
})
}
}
}
</script>
https://stackoverflow.com/questions/62481312
复制相似问题