【问题标题】:How can I send image to backend in react native?如何在本机反应中将图像发送到后端?
【发布时间】:2021-04-24 18:40:42
【问题描述】:

我想使用一个名为 react-native-image-picker 的库,使用 formData 将图像传送到后端服务器,并使用 将其保存到计算机 diskStorage upload。

但是,使用它有一些混淆。如果我使用我的代码,我会收到此错误:

MulterError:意外的字段错误。

如何修复代码?

这是我的代码

(front/Third.js)

    const Third = () => {
      const [imageSource, setImageSource] = useState(undefined);
      const dispatch = useDispatch();
     
      const options = {
        title: 'Load Photo',
        customButtons: [
          {name: 'button_id_1', title: 'CustomButton 1'},
          {name: 'button_id_2', title: 'CustomButton 2'},
        ],
        storageOptions: {
          skipBackup: true,
          path: 'images',
        },
      };

               const showCameraRoll = () => {
        launchImageLibrary(options, (response) => {
          if (response.error) {
            console.log('LaunchImageLibrary Error: ', response.error);
          } else {
            setImageSource(response.uri);
          }
               console.log('response.uri:', response.uri);

      // response.uri: file:///data/user/0/com.cookingrn/cache/rn_image_picker_lib_temp_5f6898ee-a8d4-48c9-b265-142efb11ec3f.jpg

          const form = new FormData();
          form.append('Files', {
            name: 'SampleFile.jpg', // Whatever your filename is
            uri: response.uri, //  file:///data/user/0/com.cookingrn/cache/rn_image_picker_lib_temp_5f6898ee-a8d4-48c9-b265-142efb11ec3f.jpg
            type: 'image/jpg', // video/mp4 for videos..or image/png etc...
          });

          dispatch({
            type: UPLOAD_IMAGES_REQUEST,
            data: form,
          });
        });
      };

      return (
        <Container>
          {imageSource && <Photo source={{uri: imageSource}} />}
          <ImagePickerButton onPress={showCameraRoll}>
            <Label>Show Camera Roll</Label>
          </ImagePickerButton>
        </Container>
      );
    };

    export default Third;

(后端/post.js)

    try {
      fs.accessSync('uploads');
    } catch (error) {
      console.log('uploads 폴더가 없으므로 생성합니다.');
      fs.mkdirSync('uploads');
    }

    const upload = multer({
      storage: multer.diskStorage({
        destination(req, file, done) {
          done(null, 'uploads');
        },
        filename(req, file, done) {
          const ext = path.extname(file.originalname);
          const basename = path.basename(file.originalname, ext);
          done(null, basename + '_' + new Date().getTime() + ext);
        },
      }),
      limits: {fileSize: 20 * 1024 * 1024},
    });

    router.post('/images', isLoggedIn, upload.array('image'), (req, res, next) => {
      // dispatch UPLOAD_IMAGES_REQUEST  POST /post/images
      res.json(req.files.map((v) => v.filename));
    });

(传奇/index.js)

    function uploadImagesAPI(data) {
      return axios.post('/post/images', data);
    }

    function* uploadImages(action) {
      try {
        const result = yield call(uploadImagesAPI, action.data);
        yield put({
          type: UPLOAD_IMAGES_SUCCESS,
          data: result.data,
        });
      } catch (err) {
        console.error(err);
        yield put({
          type: UPLOAD_IMAGES_FAILURE,
          error: err.response.data,
        });
      }
    }

【问题讨论】:

    标签: multer javascript node.js reactjs react-native


    【解决方案1】:

    创建一个FormData 并通过将该表单包含在request 的正文中来向后端发送一个发布请求

    const SendFileToBackend = (uri) => {
      const form = new FormData();
      form.append("Files", {
        name: "SampleFile.jpg", // Whatever your filename is
        uri: uri, //  file:///data/user/0/com.cookingrn/cache/rn_image_picker_lib_temp_5f6898ee-a8d4-48c9-b265-142efb11ec3f.jpg
        type: "image/jpg", // video/mp4 for videos..or image/png etc...
      });
    
      // Perform a Post request to backend server by putting `form` in the Body of the request
    };
    

    【讨论】:

    • 欢迎您!顺便问一下,您是否收到了向您发送401 状态的错误消息?
    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 2022-07-18
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多