TypeORM загружает и обслуживает (скачивает) файлы - PullRequest
0 голосов
/ 29 января 2020

Введение

В моем проекте я пытаюсь сохранить файлы в MySQL. Пользователь может загрузить файл (html WEB-APP). Позже у пользователя есть список загруженных файлов (html WEB-APP), и пользователь может загрузить файл по ссылке. В бэкэнде я использую проект node.js (TypeORM):

  • "typcript": "3.3.3333"
  • "body-parser" : "^ 1.19.0",
  • "debug": "^ 4.1.1",
  • "express": "^ 4.17.1",
  • "express -fileupload": "^ 1.1.6",
  • "mysql": "^ 2.14.1",
  • "отражать-метаданные": "^ 0.1. 10 ",
  • " typeorm ":" 0.2.22 "

Проблема

  • ✅ В моем коде я могу загрузить файл успешно.
  • ❌ Если я попытаюсь загрузить файл, я получу файл, который не может быть прочитан или поврежден.

Что не так в моем коде при загрузке файла?

enter image description here

Мой код

Класс сущности

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
}

Сценарий приложения

index.ts


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

1 Ответ

0 голосов
/ 29 января 2020

Я решил мою проблему.

Класс сущности

file.ts

Я изменил data: string на data: Buffer

Сценарий приложения

index.ts

изменено на

app.post("/upload", async (req, res)=>{
...
    newFile.data = fileData.data
...
})

...


app.get("/file/:id", async (req, res)=>{
...
    var fileData = result_find.data
... 
})
...