Node.js 键入表单上载和服务(下载)文件 介绍
在我的项目中,我尝试在MySQL中存储文件。用户可以上传文件(html WEB-APP)。之后,用户有一个上传文件列表(html WEB-APP),用户可以通过链接下载文件。在后端,我使用node.js(TypeORM)项目:Node.js 键入表单上载和服务(下载)文件 介绍,node.js,file,express,download,typeorm,Node.js,File,Express,Download,Typeorm,在我的项目中,我尝试在MySQL中存储文件。用户可以上传文件(html WEB-APP)。之后,用户有一个上传文件列表(html WEB-APP),用户可以通过链接下载文件。在后端,我使用node.js(TypeORM)项目: “类型脚本”:“3.3.3333” “正文分析器”:“^1.19.0” “调试”:“^4.1.1” “快车”:“^4.17.1” “快速文件上载”:“^1.1.6” “mysql”:“^2.14.1” “反映元数据”:“^0.1.10” “类型化”:“0.2.22”
- “类型脚本”:“3.3.3333”
- “正文分析器”:“^1.19.0”
- “调试”:“^4.1.1”
- “快车”:“^4.17.1”
- “快速文件上载”:“^1.1.6”
- “mysql”:“^2.14.1”
- “反映元数据”:“^0.1.10”
- “类型化”:“0.2.22”
- ✅ 在我的代码中,我可以成功上传文件李>
- ❌ 如果我尝试下载文件,我得到了一个文件,无法读取,或是已损坏李>
import {Entity, Column, PrimaryGeneratedColumn} from "typeorm"
@Entity()
export class MYFile{
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
@Column({
type: "longblob"
})
data: string
@Column()
mimeType:string
}
应用程序脚本
索引
import "reflect-metadata";
import {createConnection, getRepository, getConnection} from "typeorm";
import * as express from 'express';
import * as bodyParser from "body-parser";
import http = require("http");
var debug = require('debug')('rkdemo:server');
import * as fileUpload from "express-fileupload";
const fs = require('fs');
import {User} from "./entity/User";
import {MYFile} from "./entity/file"
const app = express();
var port = normalizePort(process.env.PORT || '3000');
var server = http.createServer(app);
app.set('port', port);
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: false }));
app.use(fileUpload({
limits: { fileSize: 50 * 1024 * 1024 },
}));
createConnection().then(async connection => {
app.get('/', (req, res) => {
res.send('Hello world!');
});
app.get("/upload", (req, res)=>{
res.send(`<form action="http://localhost:3000/upload" method="post" enctype="multipart/form-data">
<label>Wählen Sie die hochzuladenden Dateien von Ihrem Rechner aus:
<input name="datein" type="file" multiple>
</label>
<button>hochladen</button>
</form>`)
})
app.post("/upload", async (req, res)=>{
let fileData = req.files.datein
console.log(fileData);
if (Array.isArray(fileData)){
console.log("TODO: Array")
}else{
var newFile = new MYFile()
newFile.name = fileData.name
newFile.data = fileData.data.toString('base64')
newFile.mimeType = fileData.mimetype
try {
const repo = getConnection().getRepository(MYFile)
const result_File = await repo.save(newFile)
res.send("Upload complete")
} catch (error) {
console.log(error)
res.send("ERROR")
}
}
})
app.get("/file/:id", async (req, res)=>{
try {
const repo = getConnection().getRepository(MYFile)
const result_find = await repo.findOne(req.params.id)
console.log(result_find);
var fileData = Buffer.from(result_find.data, 'base64');
res.writeHead(200, {
'Content-Type': result_find.mimeType,
'Content-Disposition': 'attachment; filename=' + result_find.name,
'Content-Length': fileData.length
});
res.write(fileData);
res.end();
} catch (error) {
console.log(error)
res.send("ERROR")
}
})
}).catch(error => console.log(error));
server.listen(port, function () {
console.log('Example app listening on port: ' + port);
});
server.on('error', onError);
server.on('listening', onListening);
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
return val;
}
if (port >= 0) {
return port;
}
return false;
}
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
导入“反映元数据”;
从“typeorm”导入{createConnection,getRepository,getConnection};
从“快递”以快递方式导入*;
从“主体解析器”导入*作为主体解析器;
导入http=require(“http”);
var debug=require('debug')('rkdemo:server');
从“快速文件上传”导入*作为文件上传;
常数fs=要求('fs');
从“/entity/User”导入{User};
从“/entity/file”导入{MYFile}
常量app=express();
var port=normalizePort(process.env.port | |“3000”);
var server=http.createServer(app);
应用程序集(“端口”,端口);
use(bodyParser.json({limit:'50mb'}));
use(bodyParser.urlencoded({limit:'50mb',extended:false}));
app.use(文件上传)({
限制:{文件大小:50*1024*1024},
}));
createConnection()。然后(异步连接=>{
应用程序获取(“/”,(请求,请求)=>{
res.send('helloworld!');
});
app.get(“/upload)”,(请求,res)=>{
res.send(`
你是谁
霍奇拉登
`)
})
app.post(“/upload”),异步(请求、恢复)=>{
让fileData=req.files.datein
console.log(文件数据);
if(Array.isArray(fileData)){
log(“TODO:数组”)
}否则{
var newFile=new MYFile()
newFile.name=fileData.name
newFile.data=fileData.data.toString('base64')
newFile.mimeType=fileData.mimeType
试一试{
const repo=getConnection().getRepository(MYFile)
const result_File=wait repo.save(newFile)
res.send(“上传完成”)
}捕获(错误){
console.log(错误)
res.send(“错误”)
}
}
})
app.get(“/file/:id”),异步(req,res)=>{
试一试{
const repo=getConnection().getRepository(MYFile)
const result_find=wait repo.findOne(请求参数id)
console.log(查找结果);
var fileData=Buffer.from(result_find.data,'base64');
文书标题(200{
“内容类型”:结果\u find.mimeType,
“内容处置”:“附件;文件名=”+结果_find.name,
“内容长度”:fileData.Length
});
res.write(文件数据);
res.end();
}捕获(错误){
console.log(错误)
res.send(“错误”)
}
})
}).catch(错误=>console.log(错误));
侦听(端口、函数(){
log('示例应用程序侦听端口:'+端口);
});
server.on('error',onError);
server.on('listing',onListening);
函数normalizePort(val){
var port=parseInt(val,10);
如果(伊斯南(港口)){
返回val;
}
如果(端口>=0){
返回端口;
}
返回false;
}
函数onError(错误){
if(error.syscall!=='listen'){
投掷误差;
}
var bind=typeof端口==='string'
?管道+端口
:“港口”+港口;
开关(错误代码){
案例“EACCES”:
错误(绑定+'需要提升的权限');
过程。退出(1);
打破
案例“EADDRINUSE”:
错误(bind+'已在使用');
过程。退出(1);
打破
违约:
投掷误差;
}
}
函数onListening(){
var addr=server.address();
var bind=typeof addr=='string'
?管道+地址
:“端口”+地址端口;
调试('监听'+绑定);
}
我解决了我的问题
实体类
file.ts
我将data:string
更改为data:Buffer
应用程序脚本
索引
改为
app.post("/upload", async (req, res) => {
...
newFile.data = fileData.data
...
})
...
app.get("/file/:id", async (req, res) => {
...
let fileData = result_find.data
...
})