当前位置: 首页 > news >正文

react native上传二进制图片、视频的方法

react native获取本地图片我用的react-native-image-picker,但是它只能获取图片路径,以及base64的图片,不能获取到binary二进制形式的。

一开始我是让后端改造接口,把原本传binary的改成了base64,可是,躲得了初一躲不过十五。

上传视频是不可能走base64这种取巧的途径,于是,怎么把媒体文件转成binary给后端就成为了跨不过的坎。

找了好久的资料,总是能得到以下的的回答:


  let formData = new FormData();
  let file = { uri: uri, type: 'multipart/form-data', name: 'a.jpg' };
  formData.append("images", file);
  fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'multipart/form-data',
    },
    body: formData,
  })
    .then((response) => response.text())
    .then((responseData) => {
      console.log('responseData', responseData);
    })
    .catch((error) => { console.error('error', error) });

首先这段代码我尝试了许多次都无法把它用multipart/form-data传输,后来发现,不写Content-Type它默认倒是识别正确了!然而第二个问题我始终无法解决,就是uri通过picker拿到的只是个路径,后端是无法将这本地路径去识别成文件的,试了无数次后最终将其放弃。

所以又回到了如何把媒体文件转成binary的问题上。(使用:react-native-fs不知道行不行得通,没试过)反正const response = await fetch(FILE_LOCAL_URL); const blob = await response.blob();是行不通的。

最终,我还是通过npm搜索react native blob找到了组件:react-native-blob-util,通过它的API,总算是把文件成功传给后端接口识别了:

import { getHeader } from './common';
import { launchImageLibrary } from 'react-native-image-picker';
import { base } from '~/utils/base';
import ReactNativeBlobUtil from 'react-native-blob-util';

/** 上传图片获取url */
export function fetchUpload(fileModular, cb, isVideo) {
  launchImageLibrary({ mediaType: isVideo ? 'video' : 'photo' }, async res => {
    const curFiles = res.assets;
    if (curFiles) {
      const m = curFiles[0];
      if (m.fileSize > 1024 * 1024 * 10) {
        base.fail('图片过大,请上传10MB以内的图片');
      } else {
        base.load();
        const headers = await getHeader('multipart/form-data');
        ReactNativeBlobUtil.fetch('POST', `${global.api}/api/upload`, {
          ...headers,
        }, [
          { name: 'file', filename: m.fileName, type: m.type, data: ReactNativeBlobUtil.wrap(m.uri) },
          { name: 'fileModular', data: fileModular },
        ]).then((res) => {
          const json = JSON.parse(res.data)
          cb(json.data.res);
        }).catch((err) => {
          console.log(err)
        }).finally(() => {
          base.stop();
        })
      }
    } else {
      base.fail('请选择图片');
    }
  })
}

相关文章:

  • 如何系统的自学python?
  • 记录一个写自定义Flume拦截器遇到的错误
  • mysql进阶知识总结
  • 在 Linux 中通过 SSH 执行远程命令时,无法自动加载环境变量(已解决)
  • CVE-2023-38408漏洞修复 - 升级openssl和openssh
  • TCP协议
  • 设计模式(3):工厂模式
  • 腾讯 tendis 替代 redis linux安装使用
  • PS之更换背景色
  • Windows下载使用nc(netcat)命令
  • 3-zookeeper之ZAB协议
  • Linux内核err.h文件分析
  • ElasticSearch、java的四大内置函数式接口、Stream流、parallelStream背后的技术、Optional类
  • 【版本控制】git使用指南
  • 【工具类】vscode 常用功能
  • python(一)网络爬取
  • 小程序中使用less
  • Rust编程(四)PackageCrateModule
  • C# EventHander
  • Linux 安装Mysql
  • 美联储主席:不打算先发制人地降息,将继续观望
  • 农行原首席专家兼浙江省分行原行长冯建龙主动投案,正接受审查调查
  • 马上评|演出服“穿过就退货”的闹剧不该一再重演
  • 上海市委政法委召开会议传达学习总书记重要讲话精神
  • 欧盟公布终止进口俄能源计划,2027年为最后期限
  • 美政府称不再对哈佛大学提供联邦资助