React-Native 多部分照片上传在 android 中不起作用

Posted

技术标签:

【中文标题】React-Native 多部分照片上传在 android 中不起作用【英文标题】:React-Native multipart photo upload not working in android 【发布时间】:2019-07-18 11:40:56 【问题描述】:

我正在尝试使用 react-native 中的 fetch multipart upload 将图像文件发送/上传到我的后端服务,但是 fetch multipart form data upload 不适用于 android,但是我尝试了不同的示例。

图片上传多部分表单数据 API 基于 php,适用于 ios react-native 应用。

我正在使用 react-native-photo-upload 库来拍照。

storePicture(PicturePath:string) 
console.warn(PicturePath);
if (PicturePath) 
  const apiUrl = `$Constants.APIHOSTupdateprofileimage.php`;
  // Create the form data object
  var data = new FormData();
  data.append('profileimage',  uri:PicturePath, name: 'profileimage.jpg', type: 'image/jpg/jpeg' );
  data.append('accesstoken', this.state.user.sAccessToken);
  data.append('react-native', 1);

  // Create the config object for the POST // You typically have an OAuth2 token that you use for authentication
  const config =  method: 'POST', headers:  Accept: 'application/json', 'Content-Type': 'multipart/form-data;' , body: data ;
  fetch(apiUrl, config)
  .then(responseData =>  // Log the response form the server
    // Here we get what we sent to Postman back
    console.warn(`response:$responseData`);
  )
  .catch(err => 
    console.warn(err);
  );

这是我如何调用 storePicture() 函数的示例。

<PhotoUpload onResizedImageUri=
        avatar => 
          if (avatar) 
            this.storePicture(avatar.path);
          
        
      >
        <Image source=uri: this.state.user.sProfileImageUrl style=resizeMode:"cover", marginTop:8.0, backgroundColor:'transparent', height:120.0, width:120, borderRadius:60.0, borderWidth:0.0, borderColor:'transparent'/>
      </PhotoUpload>

【问题讨论】:

【参考方案1】:
uploadProfileImage = async (image:var) => 
this.setState(
  loading: true
);
var RNFS = require('react-native-fs');
const path = Style.IS_IOS ? image.uri : image.path;
var fileName = path.split('/').pop();
var fileType = fileName.split('.').pop();
var filePath = Style.IS_IOS ? path : 'file://' + path;

const apiURL = `$Constants.APIHOSTupdateprofileimage.php`;
const formData = new FormData();
formData.append('accesstoken', this.state.user.sAccessToken);
formData.append('reactnative', 1);
formData.append('profileimage', 
  uri:filePath,
  name: fileName,
  type: `image/$fileType`,
);
try 
  const response = await fetch(apiURL, 
    body: formData,
    method: 'POST',
    headers: 
      'Content-Type': 'multipart/form-data',
      'Accept': 'application/json',
    ,
  )
  const json = await response.json()
  this.handleUploadImageResponse(json);
 catch (err) 
  this.setState(
    loading: false
  ,console.log('catch Error: '+ err));

我正在回答我自己的问题,因为我还没有为其他面临同样问题的用户找到任何有效的答案。

如果我可以改进我的答案/帖子,或者如果需要我的任何帮助,请告诉我。

【讨论】:

【参考方案2】:

通过 Multipart FormData 将图像上传到 API

uploadPicture = () => 
  console.log(
    "Image Upload urI = " + JSON.stringify(this.state.imageSourceUri.uri)
  );
  this.setState( loading: true );

  const form = new FormData();
  form.append("fileToUpload", 
    uri: this.state.imageSourceUri.uri,
    type: "image/jpg",
    name: "12334"
  );
  fetch("http://119.82.97.221/HPBSProjectApi2/api/HPBS/PostFormData", 
    method: "post",
    body: form
  )
    .then(response => response.json())
    .then(response => 
      console.log("response = " + response);
      this.setState(
        loading: false
      );
    );
;

【讨论】:

以上是关于React-Native 多部分照片上传在 android 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

求救!android部分手机上传照片到后台服务器为啥显示的图片是不全的,有缺失,缺失部分为黑色。

如何修复照片上传错误到 Firebase 存储

004-React-Native--多图选择上传

多部分/表单数据请求在 react-native 中失败

在 react-native 中将图像上传到亚马逊 s3

MUI调用照片以及裁剪和图库照片上传到服务器后端部分Flask+MUI