节点 https 模块发送文件到 php 服务器

node https module send file to php server

如何将包含 jpg 文件的 HTTP post 请求发送到具有节点 https 模块的 php 服务器? 我尝试使用请求模块但它不可靠(大部分时间超时)并且它已经被弃用。

这是我的节点上传功能

function uploadScreen() {
var data = querystring.stringify({file: fs.createReadStream( path.join( os.tmpdir() , 'screen.jpg' ) )});
var header = {'Content-Type': 'image/jpg','Content-Length': data.length, 'User-Agent': 'Mozilla/5.0 ' + os.type() + ' Client','X-Requested-With': global.id};
var server = {hostname: 'server.net', port: 443, path: '/upload.php', method: 'POST', headers:header};
var req = https.request(server, (res) => {
    console.log('statusCode:', res.statusCode);
    console.log('headers:', res.headers);
    res.on('data', (d) => {process.stdout.write(d);});
});
req.on('error', (e) => {console.error(e);});
req.write(data);
req.end();
}

我用我的 php 服务器接收它,就像这样

<?php
$target_dir = "../";
$obj=(object)$_FILES['file'];
$userid = $_SERVER['HTTP_X_REQUESTED_WITH'];
$name=date("Ymd")."-".$userid."-".date("His").".jpg";
$tmp=$obj->tmp_name;


move_uploaded_file($tmp, $target_dir.$name);
?>

我的 php 服务器 return HTTP 200 到我的节点客户端,但没有上传文件。所有 header 均已正确发送,但 body 未正确发送。根据我的 access.log 服务器只接收 5 个字节的数据。 奇怪的是,虽然不可靠,但它正在使用旧的已弃用请求模块。

您可以使用 axios HTTP 客户端。

https://www.npmjs.com/package/axios

您可以这样修改您的代码:

const axios = require('axios');

...

async function uploadScreen() {
  try {
    let image = fs.readFileSync(path.join(os.tmpdir(), 'screen.jpg'));
    let sending_image_result = await axios({
       method: 'post',
       url: 'https://server.net:443/upload.php',
       data: {
         file: image 
       },
       headers: {
         'Content-Type': 'image/jpg',
       },
    });
    //Image is send
    console.log('Result: ', sending_image_result);
  } catch (error) {
    console.log('Error: ', error);
  }
}