【问题标题】:Upload images using form data and return to front end in React js使用表单数据上传图片并在 React js 中返回前端
【发布时间】:2021-03-30 02:39:57
【问题描述】:

我正在使用nestjs 和react js 来制作图片上传器。对于反应,我使用这个:

 const props = {
        onChange({ file, fileList }: any) {
            const fd = new FormData();
            fd.append('img', fileList[0].originFileObj);
            fetch('http://localhost:3000/upload', {
                method: 'POST',
                body: fd,
            })
                .then(async response => {
                    const data = await response.json();
                    console.log(data)
                })
                .catch(error => {
                    message.error('There was an error!', error);
                });
        },
        defaultFileList: [

        ],
    };


    return (
        <div>
            <Form
                name="form"
                className="form"
            >
            <Form.Item
                className="upload"
                valuePropName="fileList"
            >
                <Upload {...props}>
                    <Button>Upload</Button>
                </Upload>
            </Form.Item>
            </Form>
        </div>
    );
};

对于我使用的 NestJs:

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Post('/upload')
  @UseInterceptors(
    FileInterceptor('img', {
      dest: './uploads',
    }),
  )
  uploadFile(@UploadedFile() file) {
    console.log(file, 'file');
  }
}

console.log(file, 'file'); 我得到:

{
  fieldname: 'img',
  originalname: 'Full.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  destination: './uploads',
  filename: '3c45cd07145707ec09235c7bf3954d7f',
  path: 'uploads\\3c45cd07145707ec09235c7bf3954d7f',
  size: 60655
} 

问题:我应该将上面对象中的哪些信息发送回前端,哪些信息要存储在数据库中?
注意:现在,在 NestJs 应用程序的 uploads 文件夹中,我在上传图像后存储了 3c45cd07145707ec09235c7bf3954d7f。我怎么知道,我应该在我的服务器上发送数据,服务器应该返回有效的文件(图像)。
谁能帮忙?

【问题讨论】:

    标签: javascript reactjs nestjs


    【解决方案1】:

    首先,我建议您在保存文件时将原始扩展名附加到唯一的文件名,例如3c45cd07145707ec09235c7bf3954d7f.jpg。这是因为您通常希望在不执行其他逻辑的情况下静态地提供此文件。如果您不使用扩展名保存它,则必须在提供文件时自己分配 mimetype。

    您可以使用自定义回调为文件名添加扩展名:

        FileInterceptor('img', {
          dest: './uploads',
          filename: (req: any, file: any, cb: any) => {
            cb(null, `${generateRandomUUID()}${extname(file.originalname)}`);
          },
        })
    

    这个文件名是您访问该文件所有内容所需的全部内容。如果需要,您可以将其连同原始文件名、大小、mimeType、编码等一起存储在数据库中。

    如果您将文件名发送到前端就足够了。然后,前端可以向/uploads/3c45cd07145707ec09235c7bf3954d7f.jpg 发出 GET 请求,它将得到它的图像。您需要静态提供 uploads 目录,或者如果您想在提供文件之前执行其他逻辑,则可以创建类似 /uploads/:filename 的端点。

    【讨论】:

    • 您的回答对我很有帮助。一个问题,如果我每次都将我的图像存储在服务器上的上传文件夹中,我将能够存储多少张图像?这不是一个坏习惯还是可以?为什么我应该将有关图像If you want, you can store this in the database, along with the original file name, size, mimeType, encoding etc 的数据存储在数据库中,目的是什么?
    • @Asking 你可以存储尽可能多的硬盘空间。这是一种不好的做法,取决于您的用例。如果您要永远保留这些文件,那没关系。如果没有,您可能需要定期运行检查以删除未使用的文件。因为用户可能上传文件但不使用它。保存该数据的目的再次取决于您的用例。假设您在前端有一个用于上传文件的 CMS。您可能希望按文件大小对文件进行排序。如果发生这种情况,使用数据库而不是文件系统会更容易。您可能还希望保留原始文件名以便更好地识别。
    • 与将图像存储在数据库中有关。如果我想将它存储在数据库中,我应该在那里存储什么数据?这个3c45cd07145707ec09235c7bf3954d7f.jpg?如果在这种情况下,如果我将图像存储在文件系统中,我应该在 UI 上提供数据,如果我将数据存储在 DB 中而不存储在文件系统中,如何在 UI 上发送图像?谢谢。
    • @Asking 您需要将文件本身存储在文件系统中并从那里提供服务。除此之外,您可以将文件的名称以及有关文件的其他数据存储在数据库中。但这是可选的。
    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 2019-10-17
    • 2013-11-16
    • 2017-06-23
    • 2018-01-22
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多