我已经在VueJS论坛上提出了我的问题:https://forum.vuejs.org/t/file-upload-with-formdata-vue-resource/20952/3
但是!如果重复我的成功机会,我会问你我的问题。
我只有一个输入类型文件(没有表单父节点),我正在尝试将FormData和Vue-resource http的文件异步上传到我的Laravel 5.5 API后端..
为了测试我的上传,我的控制器返回一个带有我的$ request转储的JSON响应。
好吧,我有200个代码,但不幸的是我的回答是空的..
感谢您的帮助:))
客户端代码
export default {
name: 'profile',
data () {
return {
user: {},
files: [],
filepath: false,
imageData: ''
}
},
mounted () {
this.user = this.$store.getters.user
},
methods: {
reset: function () {
this.remove()
},
upload: function (e) {
var data = new FormData()
var file = this.files[0]
data.append('test', 1234)
data.append('avatar', file)
this.$http({
url: this.user.actions.updateAvatar,
body: data,
method: 'POST',
responseType: 'json',
before: function (request) {
console.log(request)
}
})
.then((response) => {
console.log(response)
})
.catch((errorResponse) => {
console.log(errorResponse)
})
},
sync: function (e) {
e.preventDefault()
this.files = e.target.files || e.dataTransfer.files
if (!this.files.length) {
return
}
this.createFile(e, this.files[0])
},
createFile: function (e, file) {
this.filepath = URL.createObjectURL(file)
},
remove: function () {
URL.revokeObjectURL(this.filepath)
this.filepath = false
this.files = []
document.getElementById('avatar').value = ''
}
}
}
<template>
<!-- header profile -->
<div id="profile">
<section class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2">
<div class="profile">
<input type="hidden" name="_method" value="PUT"/>
<header>
<label for="avatar" class="avatar" v-if="!filepath">
<img :src="user.avatar || 'http://placehold.it/50x50'" alt="avatar">
</label>
<div class="avatar" @click="reset" v-if="filepath">
<img :src="filepath" alt="avatar">
</div>
<!-- Trigger a preview -->
<input @change="sync" id="avatar" name="avatar" type="file" accept="image/*;" class="hide">
<div class="info">
<span class="name">John Snow
<router-link :to="{ name: 'UserSettings' }">
<span class="ico gear"></span>
</router-link>
</span>
<span class="desc">Une bio de 40 caractères</span>
<span class="social">
<span class="ico fb"></span>
<span class="ico tw"></span>
</span>
</div>
</header>
<!-- Trigger upload -->
<span @click="upload" class="btn-save" v-if="filepath">
Enregistrer
</span>
</div>
</div>
<div class="col-lg-8 col-lg-offset-2">
<div class="col-lg-12">
<router-link :to="{ name: 'UserPosts' }">
<span for="dechet" class="nb-dechet">122 déchêts postés</span>
</router-link>
|
<router-link :to="{ name: 'UserBookmarks' }">
<span for="dechet" class="nb-dechet">122 déchêts sauvegardés</span>
</router-link>
|
<router-link :to="{ name: 'UserTrophies' }">
<span for="reward" class="nb-dechet">1 trophé obtenu</span>
</router-link>
</div>
</div>
</div>
</section>
<hr>
<!-- posts -->
<section class="container">
<div class="row">
<router-view></router-view>
</div>
</section>
</div>
</template>
服务器端代码
答案 0 :(得分:0)
您的代码没有任何问题,只是response()->json()
无法将Illuminate\Http\UploadedFile
转换为json。
您的文件正在上传,请尝试检查
return response()->json([
'avatar' => $request->file('avatar')->getClientOriginalName()
]);
并且您将获得该文件的名称作为回应。
<强>原因强>
无法将Illuminate\Http\UploadedFile
转换为JSON响应的原因是它没有实现Illuminate\Contracts\Support\Jsonable