Наскоро създадох API, който приема файлове. Опитвам се да тествам API с помощта на Postman. Ако направя заявка за публикуване, използвайки x-wwww-form-urlencoded
тип тяло, всичко работи и получавам всички очаквани данни. Единственият проблем е, че не позволява да се изпрати файл. Ако използвам form-data
тип тяло, което ви позволява да изпращате файлове, аз не "tполучавате нещо в задния край. Не съм сигурен дали нещо не е наред с Пощальон или ако правя нещо нередно. Предполагам, че бек-ендът не приема form-data
в момента, затова не получавам никакви данни. Нещо, което бих могъл да направя, за да променя това?
Заглавките ми изглеждат подобно досега,
res.setHeader("Access-Control-Allow-Origin", origin);
res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, form-data");
app.js
app
// static route will go to the client (angular app)
.use(express.static("client"))
// secured routes
.use("/api", secured_route)
// add a user route
.post("/user", user_api_controller.add_user)
// delete this in the production
.use(function(req, res, next) {
res = allowed_orgins(req, res);
next();
})
;
allowed_orgins = function (req, res){
var allowedOrigins = ["http://localhost:4200", "http://localhost:8100"];
var origin = req.headers.origin;
if(allowedOrigins.indexOf(origin) > -1){
res.setHeader("Access-Control-Allow-Origin", origin);
res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, multipart/form-data");
}
return res;
}
user_api_controller.js
module.exports.add_user = function (req, res) {
console.log(req.body.username);
console.log(req.body.other_parameters);
}
Не получавам нищо отпечатване на конзолата, ако използвам form-data
, но работи добре, когато го използвам x-wwww-form-urlencoded
.
Аз използвах multer middle ware
, Все още не получавам нищо. Средният посуда влиза в игра, когато моят бек-енд ще получи нещо. Опитах се да получа обикновените текстови полета на form-data
и аз също не получавам това. Това означава, че моят бек-енд не може да получи всички form-data
полета, не само файлове, но и текстови полета.
Отговори:
0 за отговор № 1Ето моя супер прост експресен пример:
const express = require("express")
const fileUpload = require("express-fileupload");
const app = express()
app.use(fileUpload());
app.post("/file-upload", function(req, res, next) {
console.log(req.body.msg);
console.log(req.files);
res.send("ok");
next();
});
app.listen(3000, function () {
console.log("Example app listening on port 3000!")
})
Съжалявам, че не използвам пощальон, но го използвам curl
и работи за мен:
curl http://localhost:3000/file-upload
-H "Content-Type: multipart/form-data"
-F "file=@/YourDir/YourFile.txt"
-F "msg=MyFile"
Така че можете да опитате, да го тествате, да получите същността и да играете с приложението си, като използвате тази команда curl.
0 за отговор № 2
Всъщност заглавката на Content-Type за качване на файлове multipart/form-data
не form-data
, За да качите файл по подходящ начин в Пощальон, моля, погледнете тук: https://github.com/postmanlabs/postman-app-support/issues/1441#issuecomment-289452571
В задния ден ще ви е необходима библиотека, която да обработва multipart/form-data
поискване. Ако използвате expressjs, тази библиотека ще отговаря на вашите нужди https://www.npmjs.com/package/multer
Ето как да използвате multer
библиотека
1) Първо инсталирайте мултер
npm install --save multer
2) Включете библиотеката във вашия код (обърнете внимание, че директорията за качване трябва да съществува)
var multer = require("multer")
var upload = multer({ dest: "uploads/" })
3) Използвайте upload
като междинен софтуер за вашия add_user
крайна точка (попълнете скобите с името на вашето поле, които съдържат качен файл)
app
// other endpoints
.post("/user", upload.single(/* file field name in your form */), user_api_controller.add_user)
4) Файлът може да бъде достъпен във вашия user_api_controller.js
module.exports.add_user = function (req, res) {
console.log(req.file);
}