有一个需求,从前端到vue,连同平时的数据,在一个API请求中发送一个文件。我愿意FormData
makeFormData(data) {
const formData = new FormData();
for (const key in data) {
if (Array.isArray(data[key])) {
formData.append(key, JSON.stringify(data[key]))
} else {
formData.append(key, data[key]);
}
}
return formData;
}
我通过 axios 发送请求
// Метод компонента
async update() {
this.isLoaded = false;
const formData = this.makeFormData(this.invoice);
const res = await invoiceAPI.update(this.invoice.id, formData);
this.invoice = res.data.data;
this.initInvoiceState();
this.isLoaded = true;
this.showToast("ОК", "Счёт изменён", "success");
},
// Инстанс axios в invoiceAPI
async update(id, invoice){
const url = '/api/v1/invoices/' + id;
return defaultAPIInstance.put(url, invoice, {
headers:{
'Content-Type': 'multipart/form-data',
'Accept': '*/*'
}
});
},
//в defaultAPIInstance прописывается токен авторизации.
在控制器中只是试图输出测试请求
public function update(Request $request, $id)
{
$invoice = Invoice::find($id);
$invoice->update($request->all());
return $request->all();
// $file = $request->file('file');
// $invoice->file = $file->store('invoices');
// $invoice->save();
$this->updateInvoicePositions($invoice, $request->get('positions'));
$this->createInvoicePositions($invoice, $request->new_positions);
$this->destroyInvoicePositions($invoice, $request->deleted_positions_ids);
$this->checkInvoiceStatus($invoice);
return new InvoiceResource($invoice->fresh());
}
问题是请求有效负载中有所有数据,但是$request空数据来了,它无法发送文件。这是头条新闻,其中一切似乎都很好
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Content-Length: 2567
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBRdveT6Ekcie8afX
Host: 127.0.0.1:8001
Origin: http://127.0.0.1:8001
Referer: http://127.0.0.1:8001/
sec-ch-ua: "Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Linux"
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
我已经尝试了很多东西,但仍然无法弄清楚问题是什么。如果你只是发送一个对象,那么一切都很好,问题只在于FormData. 也许还有其他方法可以在一个请求中将文件发送到后面?
使用 POST 方法并将其添加到表单数据中
获取数据