【问题标题】:How to send image from image Uri through HTTP request? (React Native and Django Backend)如何通过 HTTP 请求从图像 Uri 发送图像? (React Native 和 Django 后端)
【发布时间】:2018-04-07 16:14:15
【问题描述】:

我正在使用 Expo 的图像选择器,我得到了这个输出:

Object {
  "cancelled": false,
  "height": 468,
  "uri": "file:///data/user/0/host.exp.exponent/cache/ExperienceData/%2540jbaek7023%252Fstylee/ImagePicker/9a12f0a3-9260-416c-98a6-51911c91ddf4.jpg",
  "width": 468,
}

我可以渲染我的图像,但我刚刚意识到 URL 是 手机的本地 URI

我正在使用 Redux-Thunk 和 Axios 发送 HTTP POST 请求

export const sendPost = ( imageUri, title, content ) => async dispatch => {
  let response = await axios.post(`${ROOT_URL}/rest-auth/registration/`, {
    image, <<<<- I can't put image uri here :( it's LOCAL path
    title,
    content
  })

  if(response.data) {
    dispatch({ type: POST_CREATE_SUCCESS, payload: response.data.token })
  } else {
    dispatch({ type: POST_CREATE_FAIL })
  }
}

更新我更改了请求调用

let headers = { 'Authorization': `JWT ${token}`};
  if(hType==1) {
    headers = { 'Authorization': `JWT ${token}`};
  } else if (hType==2) {
    headers = { 'Authorization': `Bearer ${token}`};
  }

let imageData = new FormData();
imageData.append('file', { uri: image });
let response = await axios.post(`${ROOT_URL}/clothes/create/`, {
    image: imageData,
    text, bigType, onlyMe ...
  }, {headers});

!!对不起,但图像变量名称的复杂性; image 是图像的uri。我不想更改原始变量名称的名称

在服务器上,它正在打印

'image': {'_parts': [['file', {'uri': 'file:///data/user/0/host.exp.exponent
    /cache/ExperienceData/%2540jbaek7023%252Fstylee/
    ImagePicker/78f7526a-1dfa-4fc9-b4d7-2362964ab10d.jpg'}]]}

我发现 gzip 压缩是一种发送图像数据的方法。有帮助吗?

【问题讨论】:

  • 这个答案可能对你有帮助stackoverflow.com/a/34972537/3514603
  • 我正在调查。但我认为 React 比 vanila js 有更好的选择
  • React 只是一个 UI 库。不多也不少。并且您想使用 XHR。如果您的后端在该端点支持此格式,您可以使用FormData 上传图片。
  • @RadovanKuka 我想我必须关注你的情况。你能给我发一个答案吗?
  • 你是什么意思?我按照其他人的建议建议了 FormData,或者您可以将该图像转换为 Base64,如链接问题中所回答的那样。

标签: javascript image reactjs http react-native


【解决方案1】:

另一种选择是将图像转换为 base64 并发送字符串。缩小是通常base64字符串的大小比图像本身大。

类似这样的:

function readImage(url, callback) {   
    var request = new XMLHttpRequest();
    request.onload = function() {
       var file = new FileReader();
       file.onloadend = function() {
          callback(file.result);
       }
       file.readAsDataURL(request.response);
    };   
    request.open('GET', url);   
    request.responseType = 'blob';              
    request.send(); 
}

【讨论】:

  • React-native-fetch-blob 看起来很棒
  • 在处理图像时,我通常只使用base64,因为它更容易。您不必处理位图,您可以将其作为 json 对象的一部分发送。
  • 听起来不错。我从 facebook group 得到了同样的答案。完成此操作后,我可能会编辑您的答案。我很感激你的回答。谢谢
【解决方案2】:

它必须是一个本地 URI,这没有问题,否则你将如何指向图像。

现在要上传图片,您应该首先将其包装在 FormData 中:

// add this just above the axios request
let img = new FormData();
img.append('file', { uri: imageUri });

然后在你的 axios 请求正文中添加:

image: img,

编辑:这个问题目前的形式是无法回答的。

我在我的一个项目中使用与 React-native 相同的 Expo 图像选择器作为 OP,一切正常,FormData 没有问题。

几天前在 stackoverflow 聊天中与 OP 交谈并将请求剥离为仅图像后,服务器开始抛出编码错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 168: invalid start byte

所以问题在于 OP 的 Django 后端在解析图像时没有正确设置,而不是图像本身的发送 - 这使得问题无法回答。

【讨论】:

  • 哇。我希望这行得通。在我接受之前让我在我的电脑上测试一下。
  • 感谢您的关注,但在发送请求之前,我正在处理 UI 部分。我会在 24 小时内测试它(希望如此)
  • 'image': {'_parts': [['file', {'uri': 'file:///data/user/0/host.exp.exponent/cache/ExperienceData/ %2540jbaek7023%252Fstylee/ImagePicker/78f7526a-1dfa-4fc9-b4d7-2362964ab10d.jpg'}]]}
  • 嗨!我在控制台上得到这个输出。我认为它正确指向了图像,但它没有发送实际图像。
  • 我知道请求有效,问题出在类型上,添加 'content-type': 'multipart/form-data'
【解决方案3】:

你不能使用 react-native-fetch-blob .....

import RNFetchBlob from " react-native-fetch-blob"
  PostRequest(PATH){
      RNFetchBlob.fetch('POST', "[URL]", {

            "x-session-id": "SESSION_ID", //or Custom headers
            'Content-Type': 'multipart/form-data',

        }, [

                { name: 'image', filename: 'vid.jpeg', data: RNFetchBlob.wrap(PATH) },
                // custom content type

            ]).then((res) => {
                console.log(res)

            })
            .catch((err) => {
                console.log(err)
                // error handling ..
            })
        }
  }

供参考react-native-fetch-blob

【讨论】:

  • 很遗憾 Expo 不允许使用它
  • @JohnBaek 任何建议如何在世博会上做到这一点?
  • @Ma9ic 远离世博会。
  • react-native-fetch-blob 现在不再可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多