NodeJS,Axios-将文件从本地服务器发布到另一台服务器



我有一个API端点,让客户端将csv发布到我们的服务器,然后再发布到其他服务器。我已经完成了将上传的文件保存到服务器的服务器部分,但我无法完成其他部分。我一直收到错误{ message: 'File not found', code: 400 },这可能意味着文件永远无法到达服务器。我用axios做代理,有人知道怎么做吗?谢谢

// file = uploaded file
const form_data = new FormData();
form_data.append("file", fs.createReadStream(file.path));
const request_config = {
method: "post",
url: url,
headers: {
"Authorization": "Bearer " + access_token,
"Content-Type": "multipart/form-data"
},
data: form_data
};
return axios(request_config);

更新

正如axios文档所述,我试图调用的API需要一个文件

//data是要作为请求主体发送的数据//仅适用于请求方法"PUT"、"POST"one_answers"PATCH"//如果未设置transformRequest,则必须为以下类型之一://-string,普通对象,ArrayBuffer,ArrayBBufferView,URLSearchParams//-仅限浏览器:FormData、File、Blob//-仅节点:流,缓冲区

有什么方法可以让axios作为一个整体发送文件吗?谢谢

两个最古老的答案对我来说不起作用。然而,这起到了作用:

const FormData = require('form-data'); // npm install --save form-data
const form = new FormData();
form.append('file', fs.createReadStream(file.path));
const request_config = {
headers: {
'Authorization': `Bearer ${access_token}`,
...form.getHeaders()
}
};
return axios.post(url, form, request_config);

form.getHeaders()返回一个具有内容类型和边界的Object
例如:

{ "content-type": "multipart/form-data; boundary=-------------------0123456789" }

我认为createReadStream是您的问题,因为它是异步的。试试这个。由于createReadStream扩展了事件发射器;听";当它结束/结束时。

var newFile = fs.createReadStream(file.path);
// personally I'd function out the inner body here and just call 
// to the function and pass in the newFile
newFile.on('end', function() {
const form_data = new FormData();
form_data.append("file", newFile, "filename.ext");
const request_config = {
method: "post",
url: url,
headers: {
"Authorization": "Bearer " + access_token,
"Content-Type": "multipart/form-data"
},
data: form_data
};
return axios(request_config);
});

这才是您真正需要的:

const form_data = new FormData();
form_data.append("file", fs.createReadStream(file.path));
const request_config = {
headers: {
"Authorization": "Bearer " + access_token,
"Content-Type": "multipart/form-data"
},
data: form_data
};
return axios
.post(url, form_data, request_config);

在我的例子中,fs.createReadStream(file.path(不起作用
我不得不使用缓冲区。

const form = new FormData();
form.append('file', fs.readFileSync(filePath), fileName);
const config = {
headers: {
Authorization: `Bearer ${auth.access_token}`,
...form.getHeaders(),
},
};
axios.post(api, form.getBuffer(), config);

我制作了一个拦截器,您可以连接到axios来处理节点axios-form-data中的这种情况。欢迎任何反馈。

  • npm i axios-form-data
  • 示例:
import axiosFormData from 'axios-form-data';
import axios from 'axios';
// connect axiosFormData interceptor to axios
axios.interceptors.request.use(axiosFormData);
// send request with a file in it, it automatically becomes form-data
const response = await axios.request({
method: 'POST',
url: 'http://httpbin.org/post',
data: {
nonfile: 'Non-file value',
// if there is at least one streamable value, the interceptor wraps the data into FormData
file: createReadStream('somefile'),
},
});
// response should show "files" with file content, "form" with other values
// and multipart/form-data with random boundary as request header
console.log(response.data);

适用于那些希望使用axios从本地文件系统(实际上是从具有正确流体系结构的任何地方(上传文件并且不想使用任何外部包(如表单数据(的人

只需创建一个可读流,并将其直接插入axios请求函数,如下所示:

await axios.put(
url,
fs.createReadStream(path_to_file)
) 

Axios在节点上下文中接受Stream类型的数据参数。

至少在Nodev.16.13.1和axiosv.0.27.2中对我来说工作良好

我也有同样的问题,我有一个"pdf创建者服务";用于从html生成PDF文档。

我使用胡子模板引擎创建HTML文档-https://www.npmjs.com/package/mustacheMustache.render函数将html作为字符串返回。我需要做什么才能将其传递给pdf-generator-service?让我们看看我在下面的建议

//...
async function getPdfDoc(props: {foo: string, bar: string}): Promise<Buffer> {
const temlateFile = readFileSync(joinPath(process.cwd(), 'file.html'))
mustache.render(temlateFile, props)
const readableStream = this.getReadableStreamFromString(htmlString)
const formData = new FormData() // from 'form-data'
formData.append('file', options.file, { filename: options.fileName })
const formHeaders = formData.getHeaders()
return await axios.send<Buffer>(
{
method: 'POST',
url: 'https://pdf-generator-service-url/pdf',
data: formData,
headers: {
...formHeaders,
},
responseType: 'arraybuffer', // ! important
},
)
}
getReadableStreamFromString(str: string): Readable {
const bufferHtmlString = Buffer.from(str)
const readableStream = new Readable() // from 'stream'
readableStream._read = () => null // workaround error
readableStream.push(bufferHtmlString)
readableStream.push(null) // mark end of stream
return readableStream
}

相关内容

最新更新