如何在 Fetch API 上将带有输入文件的数组发送到 PHP
How to send a array with input file to PHP on Fetch API
我在 HTML
中有一个表格
我有一个 fetch
AJAX,我可以在一个请求中向 return 发送多个表单,仅发送一条提醒消息。
const has = document.querySelectorAll('.main_app_form_edit');
if (has) {
const newFormData = (new FormData());
newFormData.append('_token', document.querySelector('input[name="_token"]').value);
let i = 0;
document.querySelector('.test_submit')
.addEventListener('click', (e) => {
e.preventDefault();
const formCards = document.querySelectorAll('.main_app_form_edit');
const url = formCards[0].getAttribute('action');
const method = formCards[0].getAttribute('method');
for (element of formCards) {
const formConst = (new FormData(element));
// BEGIN FILE
const file = element[3].files[0];
const newObject = {
'tmp_name': file.mozFullPath,
'lastModifiedDate': file.lastModifiedDate,
'name': file.name,
'size': file.size,
'type': file.type
};
formConst.append('img', (new URLSearchParams(newObject)).toString());
formConst.delete('image');
// END FILE
newFormData.append(
'data_' + ++i,
JSON.stringify((new URLSearchParams(formConst)).toString())
);
}
getCards(method, url, 'multipart/form-data', newFormData);
});
}
在 Laravel 中,当我尝试获取文件时,我没有将 img
数组作为文件读取的表单,因为我没有 fullPath
当我尝试使用 monFullPath
时,它不起作用:
public static function createCardsPost(Request $request)
{
$forms = $request->except(['_token', 'img']);
foreach ($forms as $form) {
// PARSEANDO OS DADOS QUE DEVEM SER PARSEADOS
parse_str($form, $dataArray);
parse_str($dataArray['img'], $img);
$dataArray['img'] = (array)$img;
$requestArray = new Request($dataArray);
$dataArray = $requestArray->except(['"_token']);
$dataArray['user_id'] = 1;
$dataArray['folder_id'] = 1;
if ($requestArray->hasFile('img') && $requestArray->img->isValid()) {
$dataArray['img'] = $requestArray->file('img')->store('/cards');
}
var_dump($dataArray);
die();
\App\Card::create($dataArray);
}
header('Content-Type: application/json');
$callback['message'] = 'Pasta e cartões cadastrados com sucesso!';
return json_encode($callback);
}
我该怎么做?如何将具有有效格式的文件数组发送到 PHP?
我解决了,解决办法:
昨天,我创建了一个解决方案。我将索引文件的唯一标识符传递给您的数据集。然后我可以找出哪个是哪个数据集。
例如:[[arrayDataSet_300]、[FormDataFile_300000]]
我将索引乘以 1000 (100 * 1000) 然后我可以发送到 Laravel 多个数据集和一个有效格式的文件
// REGRA DE NEGÓCIO DOS CARDS
const createCards = async (folderId) => {
if (typeof folderId !== 'number') {
alert('Não foi possível cadastrar. Volte mais tarde!');
throw new Error({'folder_id': folderId});
}
const newFormData = new FormData();
const formCards = document.querySelectorAll('.main_app_form_edit');
const url = formCards[0].getAttribute('action');
const method = formCards[0].getAttribute('method');
let i = 1;
for (element of formCards) {
++i;
const formData = (new FormData(element));
formData.append('folder_id', folderId);
const file = element[3].files[0];
newFormData.append((i * 1000), file);
newFormData.append(i, (new URLSearchParams(formData)));
}
newFormData.append('_token', document.querySelector('input[name="_token"]').value)
getCards(method, url, 'multipart/form-data', newFormData);
}
// FIM DA REGRA DE NEGÓCIO DOS CARDS
phplaravel边:
public static function createCardsPost(Request $request)
{
$forms = $request->except(['_token']);
for ($i = 2; $i <= (count($forms) !== 2 ? count($forms) - 2 : 2); $i++) {
// PARSEANDO OS DADOS QUE DEVEM SER PARSEADOS
parse_str($forms[$i], $dataArray);
$requestArray = new Request($dataArray);
$dataArray = $requestArray->except(['_token', 'image']);
/** -test--id- */
$dataArray['user_id'] = 1;
/** ---------- */
// ID DE RETORNO
$hrefId = $dataArray['folder_id'];
// SALVA O ARQUIVO SE HOUVER
$dataArray['img'] = Folder::saveFolder(((empty($forms[$i * 1000]) ? $forms[$i * 1000] : null)));
\App\Card::create($dataArray);
}
我在 HTML
中有一个表格我有一个 fetch
AJAX,我可以在一个请求中向 return 发送多个表单,仅发送一条提醒消息。
const has = document.querySelectorAll('.main_app_form_edit');
if (has) {
const newFormData = (new FormData());
newFormData.append('_token', document.querySelector('input[name="_token"]').value);
let i = 0;
document.querySelector('.test_submit')
.addEventListener('click', (e) => {
e.preventDefault();
const formCards = document.querySelectorAll('.main_app_form_edit');
const url = formCards[0].getAttribute('action');
const method = formCards[0].getAttribute('method');
for (element of formCards) {
const formConst = (new FormData(element));
// BEGIN FILE
const file = element[3].files[0];
const newObject = {
'tmp_name': file.mozFullPath,
'lastModifiedDate': file.lastModifiedDate,
'name': file.name,
'size': file.size,
'type': file.type
};
formConst.append('img', (new URLSearchParams(newObject)).toString());
formConst.delete('image');
// END FILE
newFormData.append(
'data_' + ++i,
JSON.stringify((new URLSearchParams(formConst)).toString())
);
}
getCards(method, url, 'multipart/form-data', newFormData);
});
}
在 Laravel 中,当我尝试获取文件时,我没有将 img
数组作为文件读取的表单,因为我没有 fullPath
当我尝试使用 monFullPath
时,它不起作用:
public static function createCardsPost(Request $request)
{
$forms = $request->except(['_token', 'img']);
foreach ($forms as $form) {
// PARSEANDO OS DADOS QUE DEVEM SER PARSEADOS
parse_str($form, $dataArray);
parse_str($dataArray['img'], $img);
$dataArray['img'] = (array)$img;
$requestArray = new Request($dataArray);
$dataArray = $requestArray->except(['"_token']);
$dataArray['user_id'] = 1;
$dataArray['folder_id'] = 1;
if ($requestArray->hasFile('img') && $requestArray->img->isValid()) {
$dataArray['img'] = $requestArray->file('img')->store('/cards');
}
var_dump($dataArray);
die();
\App\Card::create($dataArray);
}
header('Content-Type: application/json');
$callback['message'] = 'Pasta e cartões cadastrados com sucesso!';
return json_encode($callback);
}
我该怎么做?如何将具有有效格式的文件数组发送到 PHP?
我解决了,解决办法:
昨天,我创建了一个解决方案。我将索引文件的唯一标识符传递给您的数据集。然后我可以找出哪个是哪个数据集。
例如:[[arrayDataSet_300]、[FormDataFile_300000]]
我将索引乘以 1000 (100 * 1000) 然后我可以发送到 Laravel 多个数据集和一个有效格式的文件
// REGRA DE NEGÓCIO DOS CARDS
const createCards = async (folderId) => {
if (typeof folderId !== 'number') {
alert('Não foi possível cadastrar. Volte mais tarde!');
throw new Error({'folder_id': folderId});
}
const newFormData = new FormData();
const formCards = document.querySelectorAll('.main_app_form_edit');
const url = formCards[0].getAttribute('action');
const method = formCards[0].getAttribute('method');
let i = 1;
for (element of formCards) {
++i;
const formData = (new FormData(element));
formData.append('folder_id', folderId);
const file = element[3].files[0];
newFormData.append((i * 1000), file);
newFormData.append(i, (new URLSearchParams(formData)));
}
newFormData.append('_token', document.querySelector('input[name="_token"]').value)
getCards(method, url, 'multipart/form-data', newFormData);
}
// FIM DA REGRA DE NEGÓCIO DOS CARDS
phplaravel边:
public static function createCardsPost(Request $request)
{
$forms = $request->except(['_token']);
for ($i = 2; $i <= (count($forms) !== 2 ? count($forms) - 2 : 2); $i++) {
// PARSEANDO OS DADOS QUE DEVEM SER PARSEADOS
parse_str($forms[$i], $dataArray);
$requestArray = new Request($dataArray);
$dataArray = $requestArray->except(['_token', 'image']);
/** -test--id- */
$dataArray['user_id'] = 1;
/** ---------- */
// ID DE RETORNO
$hrefId = $dataArray['folder_id'];
// SALVA O ARQUIVO SE HOUVER
$dataArray['img'] = Folder::saveFolder(((empty($forms[$i * 1000]) ? $forms[$i * 1000] : null)));
\App\Card::create($dataArray);
}