Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用nodeJS从AmazonS3读取文件,并使用axios将其发布到另一台服务器_Javascript_Node.js_Amazon S3_Axios_Aws Sdk - Fatal编程技术网

Javascript 使用nodeJS从AmazonS3读取文件,并使用axios将其发布到另一台服务器

Javascript 使用nodeJS从AmazonS3读取文件,并使用axios将其发布到另一台服务器,javascript,node.js,amazon-s3,axios,aws-sdk,Javascript,Node.js,Amazon S3,Axios,Aws Sdk,我正在尝试从AmazonS3读取一个文件(图像),并使用multipart/form将其发布到另一台服务器 let imageParams = { Bucket: 'my-bucket', Key: 'imageName.jpg' }; let formData = new FormData(); formData.append('file', s3.getObject(imageParams).createReadStream()); let apiResponse =

我正在尝试从AmazonS3读取一个文件(图像),并使用
multipart/form
将其发布到另一台服务器

  let imageParams = { Bucket: 'my-bucket', Key: 'imageName.jpg' };

  let formData = new FormData();

  formData.append('file', s3.getObject(imageParams).createReadStream());

  let apiResponse = await api.post("/fileUpload", formData,
    { params: { token: process.env.API_TOKEN } }, 
    { headers: {'Content-Type': 'multipart/form-data' } } );
但我无法让它发挥作用,它让我得到了回报:

Error: Request failed with status code 415

也许我误解了
createReadStream()
是如何工作的?

使用concat作为流的管道。否则表单数据只发送流的第一个块,而服务器不知道如何处理它

比如说

const axios = require('axios');
const {S3} = require('aws-sdk');
const FormData = require('form-data');
const s3 = new S3();
var concat = require('concat-stream')

const api = axios.default.create({
    baseURL: 'http://example.com',

})

const readStream = s3.getObject({Bucket: 'bucket', Key: 'file'}).createReadStream();
readStream.pipe(concat(filebuffer => {
    const formData = new FormData();
    formData.append('file', filebuffer);
    formData.getLength((err, length) => {
        console.log(length)
        const headers = formData.getHeaders({'content-length': length})
        console.log({headers})
        return api({
            method: 'post',
            url: "/upload",
            headers: headers,
            data: formData
        })
    })

}))

你用什么做api?基本上,什么是为
fileUpload
endpoint供电?这不是我的API,当我尝试用postman上传文件时,它工作得很好……您是否尝试过删除多部分头文件,因为我可以运行您的代码而不会对模拟API产生任何问题。如果您指的是API.post,它就是axios。module.exports.api=axios.default.create({baseURL:'',});已经尝试过了,它返回了相同的错误:/it返回了500我应该这样设置参数吗?返回API({method:'post',url:/upload',headers:headers,params:{id:ticketId,token:process.env.API_token},data:formData})错误:请求失败,状态代码为500,位于createError(C:\node_modules\axios\lib\core\createError.js:16:15),位于结算(C:\node_modules\axios\lib\core\solate.js:17:12)在IncomingMessage.EventEmitter.emit(events.js:215:7)在IncomingMessage.EventEmitter.emit(domain.js:475:20)在endReadableNT(_stream\u readable.js:1184:12)在processtick和拒绝(内部/进程/任务队列.js:80:21)在IncomingMessage.handleStreamEnd(C:\node\u modules\axios\lib\adapters\http.js:236:11)它和邮递员一起工作。我有3个查询参数:token、id和actionId。标题中的值为:Content-type:multipart/form-data,主体是表单数据,只有一个值是文件。是,设置参数。您附加的调用堆栈是axios的调用堆栈,而不是来自服务器。来自服务器的错误位于错误的数据属性中。