TypeORM 上传和服务(下载)文件

2023-12-30

介绍

在我的项目中,我尝试将文件存储在 MySQL 中。用户可以上传文件(html WEB-APP)。之后用户就有了上传文件的列表(html WEB-APP),用户可以通过Link下载文件。在后端,我使用一个node.js(TypeORM)项目:

  • “打字稿”:“3.3.3333”
  • "body-parser": "^1.19.0",
  • “调试”:“^4.1.1”,
  • "快递": "^4.17.1",
  • "express-fileupload": "^1.1.6",
  • "mysql": "^2.14.1",
  • "reflect-metadata": "^0.1.10",
  • “类型”:“0.2.22”

Problem

  • ✅ 在我的代码中,我可以成功上传文件。
  • ❌ 如果我尝试下载该文件,我得到的文件无法读取或已损坏。

下载文件时我的代码有什么问题?

My Code

实体类

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
}

应用程序脚本

索引.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);
  }


我解决了我的问题。

实体类

file.ts

我变了data: string to data: Buffer

应用程序脚本

index.ts

变成

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

... 

app.get("/file/:id", async (req, res) => {
    ...
    let fileData = result_find.data
    ... 
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeORM 上传和服务(下载)文件 的相关文章

  • 如何调试 Node.js 应用程序?

    如何调试 Node js 服务器应用程序 现在我主要使用警报调试打印语句如下 sys puts sys inspect someVariable 一定有更好的调试方法 我知道谷歌浏览器 http en wikipedia org wiki
  • http模块和express模块​​有什么区别?

    我正在学习 NodeJs http www tutorialspoint com nodejs http www tutorialspoint com nodejs 我无法理解使用 http 模块 get post 方法 与使用expres
  • 如何在yarn中指定本地注册表?

    我有一个本地 Nexus 服务器 基本上我希望在上线之前先查看一下它prefer offline yarn install prefer offline cache folder C folder yarn cache preferred
  • 获取telegram群组的所有用户

    我正在尝试获取电报组的所有用户 我看到方法 getChatAdministrators 但我认为 API 没有获取所有成员的方法 我正在使用nodejs的telegram bot api Telegram 机器人 API https cor
  • Nodejs Express 隐式中间件应用于所有路由?

    我想知道 Express 是否允许我创建一个默认调用的路由中间件 而无需我将其明确放置在 app get arg 列表中 NodeJS 新手 var data title blah So I want to include this in
  • 在生产中使用 babel-node 可以吗

    我一直在使用 babel node 和 browserify 以及 babelify 转换来开发一个网站 以支持 ES6 语法 我只是想知道 我可以在生产中运行它吗 babel node server 而不是 node server 要在
  • AWS Lambda 提前结束(没有任何显式返回或回调)

    我在放入 AWS Lambda 中的一些 Node js 代码时遇到了一些问题 我需要进行几个异步调用 虽然第一个调用的行为符合我的预期 但 lambda 函数在第二个调用完成之前终止 返回值为 null 这让我认为 lambda 正在执行
  • Heroku ENOENT:没有这样的文件或目录,stat '/app/build/index.html'

    我在 Heroku 中运行一个简单的测试站点时遇到问题 由于某种原因 当我希望它从 build 提供服务时 它试图从 app build 提供内容 错误 ENOENT 没有这样的文件或目录 stat app build index html
  • Sails.js - 如何更新嵌套模型

    attributes username type email validated by the ORM required true password type string required true profile firstname s
  • 无法使用 webpack 加载 Node 原生插件

    虽然我正在使用vue cli在生成 webpack 配置的示例代码中 没有任何特定于 vue 的内容 我像这样创建示例应用程序 vue init webpack webpack modules example 生成webpack base
  • 使用 TFS 2015 运行 Jest 单元测试

    有人尝试将 jest 单元测试与 TFS 2015 集成吗 我尝试使用 Chutzpah 测试适配器 https visualstudiogallery msdn microsoft com f8741f04 bae4 4900 81c7
  • 使用 ObjectId 键和字符串数组定义映射作为 mongoose 模式中的值

    我在为数据库创建 Mongoose 架构时遇到问题 我想创建一个以 objectId 作为键 以字符串值数组作为值的映射 我能得到的最接近的是 var schema new Schema map myId type mongoose Sch
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • iOS Swift 在后台下载大量小文件

    在我的应用程序中 我需要下载具有以下要求的文件 下载大量 例如 3000 个 小 PNG 文件 例如 5KB 逐个 如果应用程序在后台继续下载 如果图像下载失败 通常是因为互联网连接丢失 请等待 X 秒然后重试 如果失败Y次 则认为下载失败
  • 是否可以从外部文件运行 openoffice 宏?

    我想从外部文件运行 OpenOffice 宏 喜欢 vlad leo soffice macro home vlad q vbs 并不是真正的答案 只是一个评论 以便提出这个问题 并希望得到答案 这可能与必须显式设置宏的权限有关 例如 编辑
  • NodeJs 环境变量与配置文件

    实际上 我有一个 NodeJS Express 应用程序 其配置文件包含主机 端口 JWT 令牌 数据库参数等参数 问题是 将这些参数直接保留在环境变量上 没有任何配置文件 并访问它们 而不需要在所有组件和模块中进行 require 配置是
  • 从文本文件 PHP 读取数据

    我只是想知道如何在 php 中读取文本文件 我想让它显示文本文件中的最后 200 个条目 每个条目都在一个新行上 Like John White Jane Does John Does Someones Name 等等 Thanks Use
  • 动态更改温斯顿的日志级别

    我尝试在运行时实现日志级别更改 我一直在关注https github com yannvr Winston dynamic loglevel blob master test https github com yannvr Winston
  • Nodemailer发送日历事件并将其添加到谷歌日历

    我正在尝试使用 nodemailer 将日历事件发送到 Gmail 帐户 这是我的代码 let transporter nodemailer createTransport host smtp gmail com port 587 secu
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确

随机推荐

  • 这段代码有什么问题,它给出了错误

    谁能告诉我这段代码有什么问题 它返回语法错误的错误 任何人都可以修复它吗 dos writeBytes twoHyphens boundary lineEnd dos writeBytes Content Disposition form
  • c++ string to boost::multi precision::cpp_int

    如何将字符串转换为 boost multi precision cpp int 此外 我有一个 txt 文件 其中包含 100 个数字 每个数字 50 位 我使用 ifstream 将它们逐行读取到字符串数组中 如何将数组中的每个字符串转换
  • 对于每个方法都返回“this”的构建器模式是否有特定术语?

    我知道这是构建器模式 但它是它的修改形式 而维基百科关于构建器模式的文章给出了示例 pizzaBuilder createNewPizzaProduct pizzaBuilder buildDough pizzaBuilder buildS
  • 如何在同一端口但不同路径上同时使用socketio和ws

    我使用socketio作为我的websocket库启动了一个应用程序 但现在我需要使用不支持socketio的sharejs 我本想改变这个库 但我在socketio方面已经取得了很大的进步 我尝试使用 websocket ws 库 它似乎
  • GPU并行编程C/C++ [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想学习 C C 中的 GPU 并行编程 我应该使用什么库和编译器 如果它们是开源的 那就太好了 注意
  • Elasticsearch 中位数组的使用和过滤

    我有一个位数组 我想根据某些位是打开还是关闭进行过滤 查看 Elasticsearch 2 3 文档 我没有看到任何有关位数组的内容 但似乎我可以使用布尔数组或二进制字段 例子 假设我有 2 个文档 每个文档都有一个位数组字段 该字段中 D
  • 主线程会在子线程完成执行之前退出吗? [复制]

    这个问题在这里已经有答案了 主线程会在子线程完成执行之前退出吗 我读了两篇文章 http www cs mtu edu shene NSF 3 e Book FUNDAMENTALS thread management html http
  • 损坏的 Youtube 缩略图不会触发错误回调

    如果图像为 404 但主机仍返回图像 是否会触发图像错误回调 我试图在将 URL 提交到服务器之前在客户端确定 Youtube 缩略图是否有效 通常 您可以生成缩略图 URL 而无需使用以下格式查询其 APIhttp img youtube
  • Cocoa、FSEvents、kFSEventStreamCreateFlagFileEvents 标志和“重命名”事件

    我一直在玩FSEvents在我的一个小应用程序中 将我的应用程序的内容与硬盘驱动器上的内容同步 基本上 它是一个小图像查看器 我希望它的内容在硬盘驱动器内容更改时更新 我使用创建我的流kFSEventStreamCreateFlagFile
  • Pythonic 方式比较两个列表并打印出差异

    我有两个保证长度相同的列表 我想比较列表中的相应值 第一项除外 并打印出不匹配的值 我这样做的方式是这样的 i len list1 if i 1 print Nothing to compare else for i in range i
  • HomePresenter 的未初始化常量

    我正在尝试实现一个 HomePresenter 在我的 Pages 控制器的 home 操作中使用 app controllers pages controller rb class PagesController lt Applicati
  • 将数据帧转换为特定格式的频率表

    我有一个 data frame 我正在尝试创建一个频率表来显示每行值的频率 所以我从这样的事情开始 d lt data frame a c 1 2 3 b c 3 4 5 c c 1 2 5 看起来像这样 a b c 1 3 1 2 4 2
  • ViewGroup.resetResolvedTextDirection 中的 Android StackOverflowError

    我刚刚去 android 市场发布我的应用程序的更新 并注意到现有安装报告了一些新错误 虽然我可以理解 并尝试做一些事情 其中的大多数 但这个让我相当困惑 java lang StackOverflowError at android vi
  • 将单词添加到用户词典中并从词典中检索它们

    我的应用程序中几乎没有编辑文本 用户可以在其中输入公司名称 客户名称 目的 诸如此类的内容 现在我想以编程方式将这些单词添加到字典中 因此他们不必每次都重新输入整个单词 相反 字典应该在他们开始输入时建议单词 我在网上搜索了同样的内容 得到
  • pyinstaller 2.0 - 如何为 Windows exe 文件添加描述?

    如何向单个文件 exe 添加版本 版权 文件描述等描述 python pyinstaller py F w i favicon ico C Projekte Eclipse MyApp app pyw version file 版本信息 t
  • 如何忽略 Jacoco 的 lombok.@UtilityClass?

    我用过lombok UtilityClass to 生成私有构造函数 使班级最终 将实用程序类中的所有字段设为静态 并且 Jacoco 不涵盖 Lombok 生成的代码 如果我显式定义一个私有构造函数 Jacoco 可以识别它 因此 有任何
  • MSMPI 就地 MPI_Allreduce 不适用于 MinGW-w64 gfortran

    我正在尝试使用就地MPI Allreduce结合MinGW w64 gfortran MSYS64提供的版本9 2 和Microsoft MPI 版本10 call MPI Allreduce MPI IN PLACE srcdst n M
  • 如果我在开发代码中使用 Smart::Comments 应该注意什么?

    我知道 Smart Comments 不应在生产代码中使用 因为它是源过滤器 然而 我一直在使用Smart Comments http search cpan org perldoc Smart Comments在我的开发代码中 然后在将代
  • 我们什么时候需要 IOptions?

    我正在 Net Core 中学习 DI 但我不知道使用 DI 的好处IOptions 为什么我们需要IOptions如果我们可以没有它吗 With IOptions interface IService void Print string
  • TypeORM 上传和服务(下载)文件

    介绍 在我的项目中 我尝试将文件存储在 MySQL 中 用户可以上传文件 html WEB APP 之后用户就有了上传文件的列表 html WEB APP 用户可以通过Link下载文件 在后端 我使用一个node js TypeORM 项目