前言
基于上一遍讲了如何利用nestjs 搭建一个restful风格的后端,现在接着讲如何结合minio实现文件的上传和下载。
文中涉及到的minio 知识点参考https://blog.csdn.net/zw52yany/article/details/101217708这遍文章
完整代码请看 https://github.com/zw-slime/book-be
上传
1. 创建user和picture 实体以及关联关系
user和picture是一对多的关系,利用TypeORM的ManyToOne JoinColumn 建立两个变直接的映射关系
@Entity()
export class PictureEntity {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(type => UserEntity, user => user.pictures)
@JoinColumn()
owner: UserEntity;
@Column({
nullable: false,
})
bucketName: string;
@Column({
nullable: false,
unique: true,
})
fileName: string;
@Column({
nullable: false,
})
fileType: string;
@Column({
default: '',
})
originName: string;
@Column({
default: false,
})
isPublic: boolean;
}
@Entity({
name: 'user' })
export class UserEntity {
@PrimaryGeneratedColumn()
id: number;
@Column({
type: 'varchar',
length: 255,
unique: true,
})
name: string;
@Column({
type: 'varchar',
length: 255,
})
password: string;
@Column({
type: 'varchar',
length: 255,
})
email: string;
@Column({
type: 'varchar',
length: 255,
})
salt: string;
@Column({
name: 'create_at',
type: 'timestamp',
onUpdate: 'CURRENT_TIMESTAMP',
})
createAt: Date;
@OneToMany(type => PictureEntity, picture => picture.owner)
pictures: PictureEntity[];
}
具体形成的数据库表如下:
2. controller定义api
(1)FileInterceptor绑定上传的文件字段,然后通过@UploadedFile() file 可以获得file
(2)利用hash 生成文件名,在利用minio提供的sdk putObject 上传到minio服务器上
(3)最后利用typeOrm提供的方法上传到数据库
controller的代码如下:
@