React native 在React Native(Expo)中上载图像,使用fetch导致400错误

React native 在React Native(Expo)中上载图像,使用fetch导致400错误,react-native,fetch,multipartform-data,expo,fetch-api,React Native,Fetch,Multipartform Data,Expo,Fetch Api,我已经挣扎了好几天的图像上传。 我使用的formdata如下所示: let formData = new FormData(); formData.append('file', { uri: uri, name: `name`, type: `image/jpeg`, }); iOS上的uri类似于资产-library://asset/path 在Android上,它就像content://media/external/images/media/25377. 我尝试了各种技巧,将图

我已经挣扎了好几天的图像上传。 我使用的formdata如下所示:

let formData = new FormData();
formData.append('file', {
  uri: uri,
  name: `name`,
  type: `image/jpeg`,
});
iOS上的uri类似于资产-library://asset/path 在Android上,它就像content://media/external/images/media/25377.

我尝试了各种技巧,将图像读取为blob,删除内容类型,以及其他库,如axios等… 不管怎样,我总是得到一个400坏的文件格式错误

formdata有什么我遗漏的吗?
在后端,我们使用ASP.NET

我们遇到了类似的问题,并能够通过以下方式解决该问题。 我们使用带有multer的NodeJS后端来处理文件上传

世博会-移动应用程序代码

我们正在使用fetchapiUrl、选项执行请求

uri是本地文件路径完整uri,例如。,file:///... 在我们的例子中,apiUrl是照片的端点,而apiUrl是服务器端的端点


我认为问题可能在于formdata中uri的类型和格式。您是否尝试使用图像选择器返回的uri?

我们遇到了类似的问题,并能够通过以下方式解决该问题。 我们使用带有multer的NodeJS后端来处理文件上传

世博会-移动应用程序代码

我们正在使用fetchapiUrl、选项执行请求

uri是本地文件路径完整uri,例如。,file:///... 在我们的例子中,apiUrl是照片的端点,而apiUrl是服务器端的端点


我认为问题可能在于formdata中uri的类型和格式。您是否尝试使用图像选择器返回的uri?

您至少需要安卓文件的完整路径,而不仅仅是安卓文件系统db路径。我正在使用:mediabrary.createAssetAsyncthis.state.photo.uri将图像移动到摄像机上,然后我会返回这些资产和内容URL,不是完整路径URL。您至少需要安卓文件的完整路径,而不仅仅是安卓文件系统db path。我在将图像带到相机后移动图像:mediablibrary.createAssetAsyncthis.state.photo.uri,然后返回这些资产和内容URL,不是完整路径URL。我还没有尝试直接从图像选择器上传。但在我的用例中,我不再有文件:///uri。使用自定义相机应用程序拍摄图像后,图像将移动到相机卷。在这之后,对于iOS,它只有一个asset-library://uri;对于Android,它只有一个content://uri。我不知道如何在将绝对uri移动到相机卷后获取它。在尝试访问图像之前,您是否要求获得正确的权限,例如相机卷和存储?或者,我会尝试使用导航道具将图像选择器的原始URI传递给正在进行上载的函数/类。是的,我会,否则我将无法访问该URI。顺便说一句,我试着用原始uri的选择器上传。仍然失败,但出现了不同的错误。现在是500个内部服务器错误,我们有一个NodeJS后端,所以我很难帮助您使用ASP.NET。但我们最初在服务器端遇到了URI格式的问题。也许这是需要检查的。您可以发布接收文件的服务器端代码吗?对不起,我帮不了你更多。3小时后,你的解决方案为我解决了问题。我没有添加类型。添加文件类型后,它在Android>8上运行,问题从9+开始。天哪。谢谢我还没有尝试直接从图像选择器上传。但在我的用例中,我不再有文件:///uri。使用自定义相机应用程序拍摄图像后,图像将移动到相机卷。在这之后,对于iOS,它只有一个asset-library://uri;对于Android,它只有一个content://uri。我不知道如何在将绝对uri移动到相机卷后获取它。在尝试访问图像之前,您是否要求获得正确的权限,例如相机卷和存储?或者,我会尝试使用导航道具将图像选择器的原始URI传递给正在进行上载的函数/类。是的,我会,否则我将无法访问该URI。顺便说一句,我试着用原始uri的选择器上传。仍然失败,但出现了不同的错误。现在是500个内部服务器错误,我们有一个NodeJS后端,所以我很难帮助您使用ASP.NET。但我们最初在服务器端遇到了URI格式的问题。也许这是需要检查的。您可以发布接收文件的服务器端代码吗?对不起,我帮不了你更多。3小时后,你的解决方案为我解决了问题。我没有添加类型。添加文件类型后,它在Android>8上运行,问题从9+开始。天哪。谢谢
let options = {
  method: 'POST',
  body: formData,
  headers: {
    Accept: 'application/json',
    'Authorization': 'Bearer ' + token,
  },
};
let response = await fetch("https://myserverurl", options)
  // extract the filetype
  let fileType = uri.substring(uri.lastIndexOf(".") + 1);

  let formData = new FormData();

  formData.append("photo", {
    uri,
    name: `photo.${fileType}`,
    type: `image/${fileType}`
  });

  let options = {
    method: "POST",
    body: formData,
    headers: {
      Accept: "application/json",
      "Content-Type": "multipart/form-data"
    }
  };