当前位置: 首页 > 知识库问答 >
问题:

如何使用反应本机发布或放置原始二进制文件

范霄
2023-03-14

我需要将react本机应用程序中的图像文件放入预先配置的s3上载URL。我看到了一个fetch示例,它通过path将图像作为二进制文件上传,但它是作为多部分表单上传的。由于s3上传url只能将其作为正文中的原始二进制文件,而不能作为多部分的内容类型,因此使用fetch或react native中的任何其他库将原始二进制图像作为正文使用的语法是什么?

下面的代码将其作为表单数据上传-这不是我想要做的。

          var photo = {
            uri: response.uri,
            name: fileName,
          };
          const body = new FormData();  // how can I do this not as a form?
          body.append('photo', photo);
          const results = await fetch('https://somes3uploadurl.com, {
            method: 'PUT',
            body,
          });

共有3个答案

施永宁
2023-03-14

您不需要使用react native fs或该缓冲区库。相反,只需使用https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsArrayBuffer将结果传递给fetch的body参数。readAsBinaryString和readAsDataUrl给了我奇怪的结果。

注意:我不必在我的内容类型标题中追加"; charset=utf-8"。

例子:

const fileReader = new FileReader();
fileReader.addEventListener('load', (event: any) => {
  const buffer = event.target.result;
  return fetch(link.url, {
    method: 'PUT',
    body: buffer,
  })
    .then((response) => {
      if (!response.ok) {
        throw new Error(
          `${response.status}: ${response.statusText}`
        );
      }
      return response;
    })
    .then(resolve, reject);
});
fileReader.addEventListener('error', reject);
fileReader.addEventListener('abort', reject);
fileReader.readAsArrayBuffer(file);
扶隐水
2023-03-14

您还可以使用下一个解决方案:

  /**
   * @param {{contentType: string, uploadUrl: string}} resourceData for upload your image
   * @param {string} file path to file in filesystem 
   * @returns {boolean} true if data uploaded
   */
  async uploadImage(resourceData, file) {
    return new Promise((resolver, rejecter) => {
      const xhr = new XMLHttpRequest();

      xhr.onload = () => {
        if (xhr.status < 400) {
          resolver(true)
        } else {
          const error = new Error(xhr.response);
          rejecter(error)
        }
      };
      xhr.onerror = (error) => {
        rejecter(error)
      };

      xhr.open('PUT', resourceData.uploadUrl);
      xhr.setRequestHeader('Content-Type', resourceData.contentType);
      xhr.send({ uri: file });
    })
  }

并从代码中调用此函数,如:

  let isSuccess = await uploadImage({
    contentType: "image/jpeg",
    uploadUrl: "http://my.super.web.amazon.service..."
  }, "file:///path-to-file-in-filesystem.jpeg")

资料来源:https://github.com/react-native-community/react-native-image-picker/issues/61#issuecomment-297865475

窦成荫
2023-03-14

事实证明,您可以通过多种方式发送文件,包括base64和作为缓冲区

使用react本机fs和缓冲区:

base64上传正常,但图像不知怎么被破坏了。因此,我使用缓冲区上传:

export const uploadToAws = async (signedRequest, file) => {
  const base64 = await fs.readFile(file.uri, 'base64')
  const buffer = Buffer.from(base64, 'base64')
  return fetch(signedRequest, {
    method: 'PUT',
    headers: {
    'Content-Type': 'image/jpeg; charset=utf-8',
    'x-amz-acl': 'public-read',
   },
    body: buffer,
  })
}

请注意,在服务器上,您需要确保设置了正确的内容类型:{ContentType:“image/jpeg;charset=utf-8”,'x-amz-acl':'public read'},因为fetch似乎将字符集添加到了内容类型中。

 类似资料:
  • 我试图发布如下所示的原始json: 它与postman一起工作很好,但在改型中,它将单个值添加到db中,我尝试使用以下代码:

  • 问题内容: 我很确定它具有内置功能,但是在搜索或在文档中找不到任何内容。是否启用了启用multidex的标记? 另一个要注意的是:有什么方法可以查看哪些库弄乱了您的方法数量?达到64k的限制令人惊讶。 问题答案: 在其他地方找到答案。与为任何常规Android项目启用它没什么不同。 至于方法计数,此站点可以解决问题:http : //inloop.github.io/apk-method-coun

  • 问题内容: 无法通过有角度的帖子呼叫发送文件 我正在尝试通过ionic 1以角度1发布一些数据的文件。通过POSTMAN发布时,它可以正常工作。我正在申请。 在POSTMAN中 ,没有标头和数据,带有POST请求的服务url以 表单数据的形式请求http://services.example.com/upload.php正文 在我的应用中: 问题答案: 使用base64编码添加二进制文件效率很低,

  • 问题内容: 我想知道如何将Java应用程序打包到Windows,Linux和Mac OS X的本机二进制文件中。 我知道Minecraft会这样做,但我不知道怎么做。这是我想做的: 从NetBeans(最好是Eclipse)或Eclipse,自动构建三个二进制文件。 包括OpenGL等的本机库。所有。 如果可能,请混淆我的代码。 如果有某种方法可以模仿Minecraft自动更新程序功能,那就太棒了

  • 我已经有了protobuf消息对象的proto二进制文件。 现在要进行gRPC调用,我需要将其解组并通过message对象发送到gRPC客户端(该客户端将再次封送相同的对象),这会浪费延迟。 如何通过将二进制文件传递给客户端来避免这种情况?

  • 我正在编写一个react原生应用程序,其中99%的文本将使用Lato作为默认字体。 我知道我可以像这样设置<code>Text<code>组件的fontFamily: 但是我不想在每个组件上重复自己。 是否有一种方法可以定义全局文本样式,这样我就可以使用<code>文本 最好和推荐的处理方法是什么? 注意:我正在使用展览,以防这很重要。