文件从 Angular 上传到 NodeJS 后端到 NodeJS API
File Upload from Angular to NodeJS Backend to NodeJS API
我在将文件从我的 NodeJS Web 后端转发到我的 NodeJS API 时遇到问题。我不太确定我错过了什么。我只知道在到达 API 时在请求中找不到文件。希望有人能澄清我在这里遗漏的内容。
API app.js
var routes = require('./routes/index');
app.use('/api', routes.api);
API /routes/index.js
exports.api = require('./api');
API /routes/api.js
const express = require('express');
const router = express.Router();
const multer = require('multer');
const upload = multer();
router.post("/file/upload", upload.any(), (req, res) => {
console.log("==> inside file upload <===");
console.log(req.files ? req.files.length : -1, " => num files found in request");
res.status(200).send("File Uploaded");
});
module.exports = router;
API 控制台输出
==> inside file upload <===
0 => num files found in request
POST /api/file/upload 200 19.037 ms - 13
Angular HTML
<h1 class="text-center">
Test File Upload
</h1>
<div class="row">
<div class="col-8 offset-4">
<form #frmUpload method="POST" action="/api/file/upload" enctype="multipart/form-data">
<input #inFile type="file" name="inFile" (change)="submitUpload()" />
</form>
</div>
</div>
Angular TS
@ViewChild("frmUpload", {static: false}) frmUpload: ElementRef;
@ViewChild("inFile", {static:false}) inFile: ElementRef;
submitUpload() {
const _form: HTMLFormElement = this.frmUpload.nativeElement;
_form.submit();
setTimeout(() => {
this.inFile.nativeElement.value = "";
}, 500);
}
NodeJS Web 后端 app.js
var indexRouter = require('./routes/index');
app.use('/', indexRouter);
NodeJS Web 后端 /routes/index.js
const express = require('express');
const router = express.Router();
const Path = require('path');
const multer = require('multer');
const upload = multer();
const http = require('http');
const FormData = require('form-data');
router.post('/api/file/upload', upload.any(), (req, res) => {
console.log(req.files ? req.files.length : -1, " => num files found in request");
const { headers, files } = req;
const { buffer, originalname: filename } = files[0];
const formData = new FormData();
formData.append('file', buffer, { filename });
const postReq = http.request({
host: "localhost",
port: 3000,
path: "/api/file/upload",
headers: formData.getHeaders(),
method: "POST"
}, (response) => {
console.log("api has responded");
});
postReq.end();
res.send("<p>File uploaded</p><div style='margin:10px;'><a href='/'>Go Back</a></div>");
});
/* GET home page. */
router.get('/', function(req, res, next) {
console.log("..... Render Angular ......");
res.sendFile(Path.resolve('../angular/dist/angular/index.html'));
});
module.exports = router;
NodeJS Web 后端控制台输出
1 => num files found in request
POST /api/file/upload 200 4.226 ms - 75
api has responded
查看 API 控制台输出。查看它是如何显示“找到 0 个文件”的。这就是我遇到的问题。查看 Web 后端,在我尝试将文件转发到 API 之前,您会看到该文件就在那里。关于我在这里做错了什么有什么想法吗?
您实际上需要使用管道发送表单数据。
const postReq = http.request({
host: "localhost",
port: 3000,
path: "/api/file/upload",
headers: formData.getHeaders(),
method: "POST"
}, (response) => {
console.log("api has responded");
});
formData.pipe(postReq); // <---- add this
您不需要 postReq.end()
。
要调试:
如果您真的想查看发送到 API 的内容,您可以将表单数据发送到文件。它的工作原理类似。
const fs = require('fs');
const writeStream = fs.createWriteStream('./debug.log');
formData.pipe(writeStream);
文件内容应该如下所示
----------------------------132413245123412341234
Content-Disposition: form-data; name="filename"; filename="filename.ext"
Content-Type: some/mimetype
... followed by the data
我在将文件从我的 NodeJS Web 后端转发到我的 NodeJS API 时遇到问题。我不太确定我错过了什么。我只知道在到达 API 时在请求中找不到文件。希望有人能澄清我在这里遗漏的内容。
API app.js
var routes = require('./routes/index');
app.use('/api', routes.api);
API /routes/index.js
exports.api = require('./api');
API /routes/api.js
const express = require('express');
const router = express.Router();
const multer = require('multer');
const upload = multer();
router.post("/file/upload", upload.any(), (req, res) => {
console.log("==> inside file upload <===");
console.log(req.files ? req.files.length : -1, " => num files found in request");
res.status(200).send("File Uploaded");
});
module.exports = router;
API 控制台输出
==> inside file upload <===
0 => num files found in request
POST /api/file/upload 200 19.037 ms - 13
Angular HTML
<h1 class="text-center">
Test File Upload
</h1>
<div class="row">
<div class="col-8 offset-4">
<form #frmUpload method="POST" action="/api/file/upload" enctype="multipart/form-data">
<input #inFile type="file" name="inFile" (change)="submitUpload()" />
</form>
</div>
</div>
Angular TS
@ViewChild("frmUpload", {static: false}) frmUpload: ElementRef;
@ViewChild("inFile", {static:false}) inFile: ElementRef;
submitUpload() {
const _form: HTMLFormElement = this.frmUpload.nativeElement;
_form.submit();
setTimeout(() => {
this.inFile.nativeElement.value = "";
}, 500);
}
NodeJS Web 后端 app.js
var indexRouter = require('./routes/index');
app.use('/', indexRouter);
NodeJS Web 后端 /routes/index.js
const express = require('express');
const router = express.Router();
const Path = require('path');
const multer = require('multer');
const upload = multer();
const http = require('http');
const FormData = require('form-data');
router.post('/api/file/upload', upload.any(), (req, res) => {
console.log(req.files ? req.files.length : -1, " => num files found in request");
const { headers, files } = req;
const { buffer, originalname: filename } = files[0];
const formData = new FormData();
formData.append('file', buffer, { filename });
const postReq = http.request({
host: "localhost",
port: 3000,
path: "/api/file/upload",
headers: formData.getHeaders(),
method: "POST"
}, (response) => {
console.log("api has responded");
});
postReq.end();
res.send("<p>File uploaded</p><div style='margin:10px;'><a href='/'>Go Back</a></div>");
});
/* GET home page. */
router.get('/', function(req, res, next) {
console.log("..... Render Angular ......");
res.sendFile(Path.resolve('../angular/dist/angular/index.html'));
});
module.exports = router;
NodeJS Web 后端控制台输出
1 => num files found in request
POST /api/file/upload 200 4.226 ms - 75
api has responded
查看 API 控制台输出。查看它是如何显示“找到 0 个文件”的。这就是我遇到的问题。查看 Web 后端,在我尝试将文件转发到 API 之前,您会看到该文件就在那里。关于我在这里做错了什么有什么想法吗?
您实际上需要使用管道发送表单数据。
const postReq = http.request({
host: "localhost",
port: 3000,
path: "/api/file/upload",
headers: formData.getHeaders(),
method: "POST"
}, (response) => {
console.log("api has responded");
});
formData.pipe(postReq); // <---- add this
您不需要 postReq.end()
。
要调试:
如果您真的想查看发送到 API 的内容,您可以将表单数据发送到文件。它的工作原理类似。
const fs = require('fs');
const writeStream = fs.createWriteStream('./debug.log');
formData.pipe(writeStream);
文件内容应该如下所示
----------------------------132413245123412341234
Content-Disposition: form-data; name="filename"; filename="filename.ext"
Content-Type: some/mimetype
... followed by the data