簡體   English   中英

如何將 Express.Multer.File 轉換為 Blob 數據?

[英]How convert Express.Multer.File to Blob data?

我的 controller 中有一個NestJs項目 我接受Express.Multer.File但我需要將它發送到另一台服務器。 如何將其轉換為Blob以傳遞給FormData

#action in my controller

    @Post('/upload')
    @UseInterceptors(FileInterceptor('avatar'))
    async uploadUserProfileAvatar(@UploadedFile() file: Express.Multer.File){
        
        console.log(file)
        let blob = new Blob(file.mimetype)
        let formData = new FormData()
        //can't set because file is not Blob
        formData.append('file',file)


        let request$ = this.httpService.post('http://test_server/file',formData,{headers:{
            'Content-Type':'multipart/form-data'
        }}).pipe(
            map(response => response.data)
        )

        request$.subscribe( response => {
            console.log(response)
            return response
        })
    }

我將不勝感激每一個答案!

編輯:

再次感謝您的幫助,結果:我設法通過這種方式成功發送了代碼:

    @Post('/upload')
    @UseInterceptors(FileInterceptor('avatar'))
    async uploadUserProfileAvatar(@UploadedFile() file: Express.Multer.File){

        const FormData = require('form-data');
        const formData = new FormData();
        formData.append('file', Buffer.from(file.buffer) , file.originalname);


        let request$ = this.httpService.post('http://nginx_files/file',formData,{headers:formData.getHeaders()}).pipe(
                map(response => response.data)
            )

        request$.subscribe( response => {
            console.log(response)
            return response
        })
    }

像這樣使用formdata package:

  const FormData = require('form-data');

  const formData = new FormData();
  formData.append('file', fileContent, 'file_name.ext');

  let request$ = this.httpService.post('http://test_server/file',
    formData,
    { headers: formData.getHeaders() }
  ).pipe(
            map(response => response.data)
        )

遇到同樣的問題,但最初的答案對我不起作用,不得不添加Content-Length header 和contentType ,所以代碼看起來像這樣:

import * as FormData from 'form-data';

// ...

    processFile(file: Express.Multer.File) {
        const formData = new FormData();

        formData.append('file', Buffer.from(file.buffer), {
            filename: file.originalname,
            contentType: file.mimetype,
        });

        return this.httpService
            .post('http://test_server/file', formData, {
                headers: {
                    ...formData.getHeaders(),
                    'Content-Length': `${formData.getLengthSync()}`,
                },
            })
            .pipe(map((response) => response.data));
    }

基於此評論

@MiyRon

您會收到錯誤“TypeError: source.on is not a function”,因為 formData 只接受三種類型的元素。 字符串、緩沖區和 Stream。

因此,您可以使用以下方法修復它:

formData.append('file', JSON.stringify(fileContent), 'file_name.ext');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM