В моем приложении node я хочу получить файл с одного сервера, а затем загрузить его на другой сервер. У меня есть следующий код:
const axios = require("axios");
const FormData = require("form-data");
const { createWriteStream, createReadStream } = require("fs");
const response = await axios({
url: "https://first-server/image.png",
method: "GET",
responseType: "stream",
});
await new Promise((res) => {
response.data.pipe(
createWriteStream("someFile.png").on("finish", () => {
res();
})
);
});
const form = new FormData();
form.append("file", createReadStream("./someFile.png"));
const postHeaders = {
headers: {
Authorization: "Bearer " + env("APY_KEY"),
...form.getHeaders(),
},
data: form,
};
axios.post("https://second-server.com/api", form, postHeaders)
.then((response) => {
console.info(JSON.stringify(response.data));
})
Этот код работает, но я думаю, что это неправильный способ сделать это, так как он записывает извлеченный файл на локальный диск, прежде чем снова отправить его на второй сервер. Мне нужно иметь возможность загрузить файл, не записывая его на локальный диск. Там в любом случае?
Просто замените form.append("file", createReadStream("./someFile.png"));
на
form.append("file", response.data);
И response.data
, и createReadStream("./someFile.png")
доступны для чтения.
Это странно. Это была моя первая попытка, и она не сработала. Но теперь я попробовал это снова, и это работает
Примечание. Вы можете напрямую передавать возвращенные потоковые данные без необходимости создания временного файла.
const axios = require("axios");
const FormData = require("form-data");
axios({
url: "http://localhost:3000/temp.png",
method: "GET",
responseType: "stream",
}).then(response => {
response.data.on("data", function(data) {
const form = new FormData();
form.append("file", data);
const postHeaders = {
headers: {
// Authorization: "Bearer " + env("APY_KEY"),
...form.getHeaders(),
},
data: form,
};
axios.post("http://localhost:8000/api", form, postHeaders)
.then((response) => {
// console.info(JSON.stringify(response.data));
})
.catch(function(error){
console.info(error)
});
});
})
.catch(function(error){
console.info(error)
});
Требуются ли вашему второму серверу все данные сразу или они могут передаваться по конвейеру по мере их поступления? Если для этого требуются данные целиком, их неизбежно нужно буферизовать на диске перед отправкой на второй сервер.