Javascript 将多个图像从NODEJS上传到PHP服务器
NodeJS开发人员, 我有一种情况,我必须从NodeJS上传本地图像到PHP服务器。 没有错误,请求成功,但图片不会出现在PHP服务器中 注意:我是一名nodeJS开发人员,在PHP方面没有太多经验 下面是我们要做的: 在NodeJs中,有一个文件列表,现在我想一个接一个地将这些文件添加到formData中,然后,我必须将这些表单数据发布到PHP服务器,以便将图片上传到PHP服务器 在PHP服务器中,在第一行,它接收来自post请求的文件,然后使用循环将支持扩展名的文件逐个移动到上载目录,循环完成后,它使用包含文件下载URL的数组发回响应 一切正常,我已经对一切进行了处理,一切都有完美的值,甚至HTTPS POST请求也成功了,但是PHP服务器没有图像,PHP服务器没有在请求中接收文件,所以看起来多部分数据在NodeJs中不起作用 看起来formData在NodeJs中工作不正常,因为相同的代码在浏览器中的客户端JS上工作 NodeJS:-Javascript 将多个图像从NODEJS上传到PHP服务器,javascript,php,node.js,Javascript,Php,Node.js,NodeJS开发人员, 我有一种情况,我必须从NodeJS上传本地图像到PHP服务器。 没有错误,请求成功,但图片不会出现在PHP服务器中 注意:我是一名nodeJS开发人员,在PHP方面没有太多经验 下面是我们要做的: 在NodeJs中,有一个文件列表,现在我想一个接一个地将这些文件添加到formData中,然后,我必须将这些表单数据发布到PHP服务器,以便将图片上传到PHP服务器 在PHP服务器中,在第一行,它接收来自post请求的文件,然后使用循环将支持扩展名的文件逐个移动到上载目录,循环
const Axios = require('axios');
const Fs = require('fs');
const FormData = require('form-data');
var formData = new FormData();
//here allFiles is an array of object , each object contains 1 file with details like local file path ,name,size
for (var index = 0; index < allFiles.length; index++) { //Append multiple files to formData.
let currentFile = allFiles[index]
//createReadStream Retyrns fileData
let fileWithInfo = await Fs.createReadStream(currentFile.uri)
formData.append("files[]", fileWithInfo );
}
Axios.post('example.com/upload.php',formData,
{
headers: formData.getHeaders()
})
.then(d => console.log("DONE=>>>> ", d.data))
.catch((f) => console.log('FAILED=>> ', f))
});
PHP代码:-
<?php
// Count total files
$countfiles = count($_FILES['files']['name']);
// Upload directory
$upload_location = "uploads/";
// To store uploaded files path
$files_arr = array();
// Loop all files
for($index = 0;$index < $countfiles;$index++){
// File name
$filename = $_FILES['files']['name'][$index];
// Get extension
$ext = pathinfo($filename, PATHINFO_EXTENSION);
// Valid image extension
$valid_ext = array("png","jpeg","jpg");
// Check extension
if(in_array($ext, $valid_ext)){
// File path
$path = $upload_location.$filename;
// Upload file
if(move_uploaded_file($_FILES['files']['tmp_name'][$index],$path)){
$files_arr[] = $path;
}
}
}
echo json_encode($files_arr);
die;
您在NodeJS代码中的循环中遗漏了allFiles.length参数。
将显示正确的代码
for (var index = 0; index < allFiles.length; index++) {
PHP代码是正确的,但如果您发送一个空文件数组,它将不会是一个错误,并将返回成功响应 在NodeJS代码中的循环中缺少allFiles.length参数。
将显示正确的代码
for (var index = 0; index < allFiles.length; index++) {
PHP代码是正确的,但如果您发送一个空文件数组,它将不会是一个错误,并将返回成功响应
const{readFile}=require'fs/promissions';
对于let指数=0;索引您在axios post请求中缺少formData数据。您可以直接传递formData或调用formData.getBuffer。也许我的答案无法解决问题,但我建议对PHP代码进行一些更改。当然,$\u FILES数组中的键不能是数字,最好使用foreach而不是For。我允许自己稍微修改一下你的代码,使之更小
<?php
// Upload directory
$upload_location = "uploads/";
// To store uploaded files path
$files_arr = array();
// Valid image extension
$valid_ext = array("png","jpeg","jpg");
foreach($_FILES['files']['name'] as $key => $file) {
if(
in_array(pathinfo($_FILES['files']['name'][$key], PATHINFO_EXTENSION), $valid_ext)
&&
move_uploaded_file($_FILES['files']['tmp_name'][$key],$upload_location.$_FILES['files']['name'][$key])
) {
$files_arr[] = $upload_location.$_FILES['files']['name'][$key];
} else {
//Only for debugging
$files_arr[] = 'Not uploaded: '.$upload_location.$_FILES['files']['name'][$key];
}
}
echo json_encode($files_arr);
die;
也许我的答案不能解决问题,但我建议对PHP代码进行一些修改。当然,$\u FILES数组中的键不能是数字,最好使用foreach而不是For。我允许自己稍微修改一下你的代码,使之更小
<?php
// Upload directory
$upload_location = "uploads/";
// To store uploaded files path
$files_arr = array();
// Valid image extension
$valid_ext = array("png","jpeg","jpg");
foreach($_FILES['files']['name'] as $key => $file) {
if(
in_array(pathinfo($_FILES['files']['name'][$key], PATHINFO_EXTENSION), $valid_ext)
&&
move_uploaded_file($_FILES['files']['tmp_name'][$key],$upload_location.$_FILES['files']['name'][$key])
) {
$files_arr[] = $upload_location.$_FILES['files']['name'][$key];
} else {
//Only for debugging
$files_arr[] = 'Not uploaded: '.$upload_location.$_FILES['files']['name'][$key];
}
}
echo json_encode($files_arr);
die;
首先,我通过php-S localhost:8000启动了本地服务器
运行本地服务器后,我使用node index.js运行index.js文件
我在本地测试了代码,它工作正常
首先,我通过php-S localhost:8000启动了本地服务器
运行本地服务器后,我使用node index.js运行index.js文件
我在本地测试了代码,代码运行正常。现在作为临时解决方案,我使用的是restler库,但它只能在一个请求中发送单个文件,我想要一个可以将多个文件上载到PHP服务器的解决方案。您是否测试了该请求正在到达服务器作为临时解决方案我正在使用restler库,但它只能在一个请求中发送单个文件,我想要一个可以将多个文件上载到PHP服务器的解决方案。您是否测试了该请求正在到达服务器Hello nkitku,感谢您的时间,我已经尝试了这两种解决方案,结果是相同的没有收到PHP服务器上的文件。您好nkitku,感谢您的时间,我已经尝试了这两种解决方案,结果是相同的,没有收到PHP服务器上的文件。您好,Chandan,谢谢您的回复,我为在StackOverflow上发布它做了一个特定的代码,所以错误地从Stac中删除了formData
但是,原始代码包含formData,仍然不起作用。您好Chandan,谢谢您的回复,我为在StackOverflow上发布它制作了一个特定的代码,因此,错误地从StackOverflow中删除了formData,但是原始代码包含formData,仍然无法工作。您能显示从服务器收到的响应吗?我也试过你的JS代码,一切都一样,但它仍然不起作用我收到一个空数组,文件没有被发送到PHP,我的回答是:它对你有效,但对我无效我不知道为什么,如果你不介意的话,你能试一下它对图像是否也有效吗?由于文件类型不同,我认为它适合您。非常感谢您的时间,我对您的帮助意见进行了投票。您可以分享您使用的php版本和节点的详细信息吗?php版本7.2.34,节点版本12.18.2您可以显示从服务器收到的响应吗?我也试过你的JS代码,一切都一样,但它仍然不起作用我收到一个空数组,文件没有被发送到PHP,我的回答是:它对你有效,但对我无效我不知道为什么,如果你不介意的话,你能试一下它对图像是否也有效吗?由于文件类型不同,我认为它适合您。非常感谢您的时间,我已经对您的帮助意见进行了投票。您可以分享您使用的php版本7.2.34、node版本12.18.2的php和node的详细信息吗
const Axios = require('axios');
const Fs = require('fs');
const FormData = require('form-data');
const allFiles = [
{uri: 'my/Spark_Dataset/combin.csv'},
{uri: 'my/Spark_Dataset/combine-csv.csv'},
// {uri: 'C:\\Users\\my\\combine-csv.csv'}
];
(async function() {
var formData = new FormData();
//here allFiles is an array of object , each object contains 1 file with details like local file path ,name,size
for (var index = 0; index < allFiles.length; index++) { //Append multiple files to formData.
// console.log(index);
let currentFile = allFiles[index]
//createReadStream Retyrns fileData
// console.log(currentFile);
let fileWithInfo = await Fs.createReadStream(currentFile.uri)
formData.append("files[]", fileWithInfo );
}
console.log(formData);
Axios.post('http://localhost:8000/upload.php',
formData,
{
headers: formData.getHeaders(),
// 'Content-Type':'multipart/form-data',
})
.then(d => console.log("DONE=>>>> ", d.data))
.catch((f) => console.log('FAILED=>> ', f))
})();
packages.json
"axios": "^0.20.0",
"form-data": "^3.0.0",
"fs": "0.0.1-security",