Tìm kiếm trang web

typescript - Làm thế nào để tải ảnh lên từ expo-image-picker?


Tôi đã thử nhiều cách để tải ảnh lên từ expo-image-picker, nhưng vẫn chưa tìm ra. Máy chủ là nestjs cổ điển với multer

  @Post()
  @UseInterceptors(FileInterceptor('file'))
  public addTimelineEventWithSingleImage(
    @Headers('x-token') token: string,
    @UploadedFile() file: Express.Multer.File,
    @Body() body: IAddEventBody
  ): Promise<void> {
    console.log('file', file);
    console.log('body', body);
  }

những bản ghi là:

Mar 5 04:13:00 PM  file undefined
Mar 5 04:13:00 PM  body {
Mar 5 04:13:00 PM    _parts: [
Mar 5 04:13:00 PM      [ 'file', [Object] ],
Mar 5 04:13:00 PM      [ 'description', '' ],
Mar 5 04:13:00 PM      [ 'eventType', 'COMMENT' ]
Mar 5 04:13:00 PM    ]
Mar 5 04:13:00 PM  }

Tôi đang tạo formData theo nhiều cách khác nhau

  1. từ bài viết này dưới dạng blob
      const formData = new FormData();
      formData.append('file', blob);
      formData.append('description', timelineEvent.description);
      formData.append('eventType', timelineEvent.eventType);
  1. với uri, tên và loại
formData.append('file', {
 name: image.uri.split('/').pop(),
 type: 'image/jpg',
 uri: Platform.OS === 'android' ? image.uri : image.uri.replace('file://', ''),
});
  1. bộ đệm từ base64
    const formData = new FormData();
     formData.append('file', Buffer.from(image, 'base64'));
     formData.append('description', timelineEvent.description);
     formData.append('eventType', timelineEvent.eventType);

Tôi đã kiểm tra endpoint bằng Postman và nó hoạt động. Nguồn của URI là result.assets[0]:

    let result = await ImagePicker.launchCameraAsync({
      mediaTypes: MediaTypeOptions.Images,
      selectionLimit: 1,
      allowsEditing: true,
      quality: 0.8,
      base64: true,
      aspect: [1, 1],
      presentationStyle: UIImagePickerPresentationStyle.POPOVER
    });

Có vẻ như việc tải lên một bức ảnh do người dùng chụp là đơn giản, nhưng không phải vậy, có ai có thể giúp không?