Безуспешно пытаюсь запустить загрузку файлов с помощью Express / Node в облачной среде. Я могу отправить запрос, мой файл загружается на облачный сервер, но никогда не получает ответа, в результате чего мой запрос истекает. использование [express-file-upload] [1] для отправки данных в облако в виде потока битов и аксиом для их публикации.
Код API роутера My Express:
const fileUpload = require("express-fileupload");
const cloudinary = require("cloudinary");
router.use(fileUpload());
cloudinary.config({
cloud_name: "xyx",
api_key: "xyxxyxxyxxyxxyx",
api_secret: "xyxxyxxyxxyxxyxxyx"
});
router.post("/upload", function(req, res, next) {
console.info(req);
var fileGettingUploaded = req.files.file.data;
cloudinary.uploader
.upload_stream({ resource_type: "raw" }, function(error, result) {
console.info(error);
console.info(result);
})
.end(fileGettingUploaded);
});
[1]: https://www.npmjs.com/package/express-fileupload
My Axios Post Request из компонента
const { fileName } = this.state;
const formData = new FormData();
formData.append("file", fileName);
const url = `/api/upload`;
axiosInstance
.post(url, formData, {
headers: {
"Content-Type": fileName.type
}
})
.then(response => {
if (response.status === 200 && response.data) {
console.info(response);
}
})
.catch(error => {
console.info(error);
});
};
Это приводит к запросу, который успешно загружает мой файл в облако (я вижу загруженный файл на панели управления облачного хранилища), но не может дать мне ответ, который в идеале должен быть URL-адресом загруженного файла. Может ли кто-нибудь указать мне, что я делаешь неправильно?
есть ли ошибка в консоли?
@Tony Да, он не регистрирует никаких ответов. Все, что я вижу, это тайм-аут запроса по истечении указанного времени, то есть ошибка: превышено время ожидания 120000 мс ..





Здесь нужно исправить пару вещей.
A) Нет необходимости создавать это
const formData = new FormData();
formData.append("file", fileName);
Б) В вашем состоянии imgSrc у вас уже есть URL-адрес данных. Просто отправьте его на свой экспресс-сервер в качестве параметра публикации.
Что-то вроде этого:-
uploadPicture = () => {
const { fileName, imgSrc } = this.state;
const url = `/api/upload`;
axiosInstance
.post(url, {
fileUrl: imgSrc
})
.then(response => {
if (response.status === 200 && response.data) {
console.info(response);
}
})
.catch(error => {
console.info(error);
});
};
c) На вашем сервере узла прочтите URL-адрес из req.body
router.post("/upload", function(req, res, next) {
const fileGettingUploaded = req.body.fileUrl;
cloudinary.uploader.upload(fileGettingUploaded, function(result, error) {
if (result) {
res.status(200).json(result);
} else {
res.status(500).json(error);
}
});
});
Это должно решить проблему за вас.
Я не совсем уверен, что это лучший способ работы с загрузкой изображений с помощью облачного хранилища, я бы посоветовал вам прочитать об этом больше и посмотреть, как это делают другие.
На данный момент это должно решить вашу проблему.
Работает отлично! Спасибо за подробный ответ!
Как будет выглядеть imgSrc в состоянии? Это эквивалент files.file.data или даже e.target.files [0]?
Используйте новый FileReader (); После этого: reader.onload = e => {this.setState ({imgSrc: e.target.result}); }; reader.readAsDataURL (event.target.files [0]);
Вы пробовали просто регистрировать
response, то есть не проверять 200 и есть ли у негоdata?