laravel - 无法使用 axios 将图像上传到外部 API
问题描述
我一直在尝试将带有 axios 的图像上传到外部(laravel)api,这让我做噩梦。
恢复模板:
<v-form>
<v-file-input
label="Logo*"
v-model="image"
accept="image/*"
@change="onFileSelected"
required
></v-file-input>
<v-btn color="blue darken-1" text @click="createProvider">Create Provider</v-btn>
</v-form>
方法
methods: {
onFileSelected (event) {
this.selectedImage = event;
},
createProvider() {
let formData = new FormData();
formData.append("image", this.selectedImage, this.selectedImage.name);
const config = {
headers: {
Authorization: this.token,
'content-type': 'multipart/form-data'
}
};
let imageData = {
'image': formData,
'name': 'Provider Image', // Required Field
}
axios.post('http://fake_external_url.com/api/images', imageData, config) // laravel API
.then(console.log)
.catch(console.log)
},
}
我得到的错误是:
错误:请求失败,状态码为 422
请求响应:
[HTTP/1.1 422 无法处理的实体 1374ms]
{"image":{},"name":"Image Provider"}
我看到图像没有收到任何东西。
如果我 console.log this.selectedImage 我得到:
File {
name: "happy.jpg",
lastModified: 1596711013544,
webkitRelativePath: "",
size: 41292,
type: "image/jpeg"
}
如果我 console.log FormData 我得到废话
FormData
<prototype>: FormDataPrototype
append: function append()
constructor: function ()
delete: function delete()
entries: function entries()
forEach: function forEach()
get: function get()
getAll: function getAll()
has: function has()
keys: function keys()
set: function set()
values: function values()
Symbol(Symbol.toStringTag): "FormData"
Symbol(Symbol.iterator): function entries()
<prototype>: Object { … }
我的环境:XAMPP 服务器上的 localhost(也可以使用 php artisan 服务)。Laravel、VueJS、Vuetify 最新版本。
我认为我的问题喜欢在我的 FormData 中,但它可能来自它从事件点击接收的变量。我没主意了。
[编辑] 注意:我可以在使用 POSTMAN 时上传图片。我之所以使用事件,而不是经典的 event.target.files[0] 是因为 console.log 的响应中没有目标。
解决方案
你有两个问题。
表单数据
您需要发送一个 FormData 对象,只发送一个 FormData 对象,并且只发送一个 FormData 对象。
如果要传递其他数据,请将其附加到 FormData 对象。
将 FormData 对象包装在另一个对象中并将其传递给(例如)JSON 序列化程序只会破坏它。
内容类型
multipart/form-data
MIME 类型有一个强制参数 boundary
。
你省略了它,但你无论如何也不知道它是什么。
不要Content-Type
手动设置标题。底层 XHR 对象将从 FormData 对象中读取它。
推荐阅读
- vue.js - Quasar 表未更新 (v1)
- java - scala 与 java 在“无限网格中的最小步数”问题中的性能(关闭)
- mysql - 可以在 mysql 日期时间字段中存储持续时间/时间
- tsql - 存储过程中的“@”和“DECLARE”有什么区别?
- vue.js - 如何在现场焦点上打开 vuejs datepicker?
- memory - 使用跨步流访问测量峰值内存带宽有什么问题
- python-2.7 - 如何使用 python django 最小化代码
- c - 如何在 Linux 上执行 make 命令时修复“make: 'all' is up to date error”?
- python - 二进制文件需要来自管道的多个输入,而管道是由 Python 编写的,为什么在写入之间需要休眠?
- php - 在 bitrix24 中添加菜单