前端發(fā)送文件后端的nest.js如何接收文件名詳解
當(dāng)我們在前端發(fā)送文件的時候,首先把文件的數(shù)據(jù)整合起來,在業(yè)務(wù)層匯聚到接口層,接口層使用參數(shù)接收一個或多個文件:
export function useUploadFile() {
return useMutation({
mutationFn: async ({
bucket,
files,
}: {
bucket: string;
files: File[];
}) => {
const formData = new FormData();
files.forEach((file) => {
formData.append('files', file, encodeURIComponent(file.name));
});
const res = await http.post<UploadFileApiResponse>(
`${uploadFilePath}/${bucket}`,
formData,
{
headers: {
'Accept-Charset': 'utf-8',
},
}
);
return res;
},
});
}
在上面的代碼中,接收的是多個文件,使用File[]類型進行約束。
拿到文件后,先new一個FormData,用來發(fā)送文件,當(dāng)文件的發(fā)送“容器”。那么多個文件就需要把它們都放入“容器”里才行。使用forEach進行放入。
使用formdata的append函數(shù)即可添加。注意append函數(shù)的第一個參數(shù),那是文件的描述符號,可以隨便寫,當(dāng)然,開發(fā)過程中需要遵守開發(fā)標(biāo)準(zhǔn),后端接收的時候用什么描述符號,就填什么。
最關(guān)鍵的是第三個參數(shù),第三個參數(shù)是調(diào)用了encodeURIComponent函數(shù),這個函數(shù)會把字符轉(zhuǎn)換為URL-encoded UTF-8 , 也就是URL編碼的utf8格式。
那么就需要說一下nestjs的文件接收的編碼轉(zhuǎn)換的坑了。
使用nestjs接收文件時,使用:
@Post('upload/:bucket')
@UseInterceptors(FilesInterceptor('files', 100))
async uploadFile(
@Param('bucket') bucket: string,
@UploadedFiles() files: Express.Multer.File[],
) {}
這樣的方式接收文件。
問題在于它接收的時候,會把文件名從utf8轉(zhuǎn)為ISO-8859-1 (Latin-1 ) 編碼,這導(dǎo)致文件的中文名會變成:“çµå¶é”這樣的字符。
所以為了避免這樣的問題,就需要
formData.append('files', file, encodeURIComponent(file.name));
在這里調(diào)用encodeURIComponent對原始的文件名進行編碼,這樣到了后端,文件的編碼形式就不會改變。
后端使用文件名時,如下方法即可:
files.map(async (f) => {
// 解碼前端發(fā)送的url編碼形式,正確的將文件名傳輸過來
const newfilename = decodeURIComponent(f.originalname);
// 為minIO的每個文件添加一個單獨的uuid,防止文件名重名,在獲取文件信息以及下載文件時予以清除
const UUID = randomUUID();
const safeFilename = newfilename.replace(/[“”#]/g, '').trim();
this.minioService.validateFile(f);
// 保存文件信息到mysql數(shù)據(jù)庫
await this.fileService.saveFile(
safeFilename,
UUID,
f.mimetype,
f.size,
);
// 分片上傳文件到 MinIO
await this.minioService.uploadFile(UUID, f, bucket);
// 更新任務(wù)的已上傳文件數(shù)
const task = uploadTasks.get(taskId);
if (task) task.uploadedFiles++;
}),
);
可以看到在第三行,調(diào)用了decodeURIComponent對文件的原始名稱進行解碼,即可得到正確的文件名。
總結(jié)
到此這篇關(guān)于前端發(fā)送文件后端的nest.js如何接收文件名的文章就介紹到這了,更多相關(guān)后端nest.js接收文件名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實現(xiàn)煙花特效(面向?qū)ο?
這篇文章主要為大家詳細介紹了JavaScript使用面向?qū)ο缶幊虒崿F(xiàn)煙花特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
微信小程序?qū)崿F(xiàn)的一鍵連接wifi功能示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)的一鍵連接wifi功能,結(jié)合實例形式分析了微信小程序操作WiFi連接的模塊初始化、配置、連接等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
javascript學(xué)習(xí)筆記之函數(shù)定義
本文主要給大家介紹了javascript的一些函數(shù)定義方面的基礎(chǔ)知識,包括函數(shù)聲明式、函數(shù)表達式、Function 構(gòu)造函數(shù)等,十分的簡單實用,有需要的小伙伴可以參考下。2015-06-06
layui將table轉(zhuǎn)化表單顯示的方法(即table.render轉(zhuǎn)為表單展示)
今天小編就為大家分享一篇layui將table轉(zhuǎn)化表單顯示的方法(即table.render轉(zhuǎn)為表單展示),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
一道優(yōu)雅面試題分析js中fn()和return fn()的區(qū)別
這篇文章主要帶領(lǐng)大家深入理解JavaScript中 fn() 和 return fn() 的區(qū)別,感興趣的小伙伴們可以參考一下2016-07-07

