繁体   English   中英

如何在本机反应中将图像发送到后端?

[英]How can I send image to backend in react native?

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

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

MulterError:意外的字段错误。

如何修复代码?

这是我的代码

(前/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,
        });
      }
    }

创建一个FormData并向后端发送一个 post 请求,方法是将该表单包含在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
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM