Node.js 键入表单上载和服务(下载)文件 介绍

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”

在我的项目中,我尝试在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”
问题
  • ✅ 在我的代码中,我可以成功上传文件
  • ❌ 如果我尝试下载文件,我得到了一个文件,无法读取,或是已损坏
通过下载文件,我的代码有什么问题?

我的代码 实体类 file.ts


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
    ... 
})