Javascript 将多个图像从NODEJS上传到PHP服务器

Javascript 将多个图像从NODEJS上传到PHP服务器,javascript,php,node.js,Javascript,Php,Node.js,NodeJS开发人员, 我有一种情况,我必须从NodeJS上传本地图像到PHP服务器。 没有错误,请求成功,但图片不会出现在PHP服务器中 注意:我是一名nodeJS开发人员,在PHP方面没有太多经验 下面是我们要做的: 在NodeJs中,有一个文件列表,现在我想一个接一个地将这些文件添加到formData中,然后,我必须将这些表单数据发布到PHP服务器,以便将图片上传到PHP服务器 在PHP服务器中,在第一行,它接收来自post请求的文件,然后使用循环将支持扩展名的文件逐个移动到上载目录,循环

NodeJS开发人员, 我有一种情况,我必须从NodeJS上传本地图像到PHP服务器。 没有错误,请求成功,但图片不会出现在PHP服务器中

注意:我是一名nodeJS开发人员,在PHP方面没有太多经验

下面是我们要做的:

在NodeJs中,有一个文件列表,现在我想一个接一个地将这些文件添加到formData中,然后,我必须将这些表单数据发布到PHP服务器,以便将图片上传到PHP服务器

在PHP服务器中,在第一行,它接收来自post请求的文件,然后使用循环将支持扩展名的文件逐个移动到上载目录,循环完成后,它使用包含文件下载URL的数组发回响应

一切正常,我已经对一切进行了处理,一切都有完美的值,甚至HTTPS POST请求也成功了,但是PHP服务器没有图像,PHP服务器没有在请求中接收文件,所以看起来多部分数据在NodeJs中不起作用

看起来formData在NodeJs中工作不正常,因为相同的代码在浏览器中的客户端JS上工作

NodeJS:-

 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”, 网址:'http://www.yourserver.com/upload', 数据:formData, 标题:{ “内容类型”:“多部分/表单数据;边界=${form.\u boundary}`, }, }; const{readFile}=require'fs/promissions'; 对于let指数=0;索引 常数响应=等待axios{ 方法:“post”, 网址:'http://www.yourserver.com/upload', 数据:formData, 标题:{ “内容类型”:“多部分/表单数据;边界=${form.\u boundary}`, }, }; 您缺少axios post请求中的formData数据。您可以直接传递formData或调用formData.getBuffer


您在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",