如果你想使用字符串,客户端必须发送base64文件到后端。
格式:data:(mimetype);(charset),(encoded) -> data:image/png;base64,\ee\9f920d....
这里的解决方案,使用base64字符串
DTO(数据传输对象)
import { IsDefined, IsNotEmpty } from 'class-validator';
export class UpdateUserAvatarDto {
@IsDefined()
@IsNotEmpty()
file: string;
}
控制器
@UseGuards(JwtAuthGuard)
@Patch('account/avatar')
async updateAvatar(
@User() user: Payload,
@Body() updateUserAvatarDto: UpdateUserAvatarDto,
@Res() res: Response,
) {
try {
const { file } = updateUserAvatarDto;
createFile(file, { prefix: ['user', 'avatar'], name: user.id }); // file is string base64 you can store it to database.
return response(res, HttpStatus.OK, {
message: 'Successfully update avatar',
});
} catch (e) {
console.error(e);
return response(res, HttpStatus.INTERNAL_SERVER_ERROR, {
message: e,
data: null,
});
}
}
如果你想从 base64 创建文件
export const createFile = async (base64, { prefix, name }) => {
const cleanBase64 = base64.split(',')[1];
const buffer = Buffer.from(cleanBase64, 'base64');
const file = await fileType.fromBuffer(buffer);
return fs.writeFileSync(
path.join(
path.resolve('./'),
...['public', ...prefix, `${name}.${file.ext}`],
),
buffer,
);
};