RN 上传文件到以及上传文件到七牛云(初步)
本文将介绍:
- 如何使用原生 Javascript 上传文件
- 如何使用七牛云 SDK 上传文件到七牛云
在 App 中文件上传是一个非常重要的需求,但是翻遍 React Naitve 的官方文档没有发现有详细介绍文件上传的文章,在 github上 搜索一下倒是发现了不少 repo 在做这样的事情
遗憾的是这项项目都是基于 native code 实现的,虽然在 React Native 使用 Native Comment 有很好的工具支持,但是终归没有直接使用纯 JS 的库更方便。其实 React Native 已经悄悄支持了文件上传,我们可以不用引入任何依赖、从容的用几行 JS 来解决文件上的问题。

是不是非常简单直白?上面这几行代码对应到 html 的表单类似这样,我们用这几行代码模拟了一次文件上传的表单

对应的 Http 请求类似如下

下面详细分析一下这几行简短的代码的作用,

我们首先创建一个 FormData 对象,FormData 对象指代一个 Form 表单对象的内容,这里我们只需要关注 Form 内的内容和他们的 Content-Type 就可以了,这里我们添加了 key,token 和 file 这几个 form 内容,并特别指定了 file 的 Content-Disposition 的类型是 application/octet-stream ,代表这是一个任意的二进制数据,这里可以是 png,jpeg 的图片和其他任何类型。key 和 token 是服务器需要的额外信息。key 是上传到服务器的文件名,token 是请求令牌。最后在用fetch 提交请求的过程中 FormData 会帮助我们添加 Http 本身的 Content-Type等信息。

这四行简短的代码帮助我们构建了 Http 的 Payload,并实际提交到上传的服务器。实际返回的服务器端响应客户端需要处理,可以使用 fetch 的 Promise API,非常方便

这里有个坑需要提醒一下,大家在debug返回响应的时候会发现请求在一个 Promise 结束后不再进入第二个 Promise,再次发送请求,发现前面请求的 Promise 又继续执行下去。这其实是 React Native Debugger 的一个 bug,大家忽略就可以了,在非 debug 模式就一切正常了。
有了以上知识我们就可以很容易的上传文件到服务器了,这里有很多小伙伴会选择类似七牛云存储这种服务来加速开发,根据七牛的官方文档构建 token 就可以上传了,这里七牛也很贴心的推出了 React Native 平台的 SDK
使用 SDK 之后上传文件就变的非常简单了,首先是安装

安装之后配置自己的 AK 和 SK,这个可以在个人中心里面找到

这里我们再举一个现实世界的例子,用户在图片库中选择图片之后上传到七牛云存储,因为目前 React Native 官方还不支持从图片库,摄像头等多个渠道获取图片,这里的代码使用了另外一个开源库https://github.com/marcshilling/react-native-image-picker 。
完整demo:https://github.com/buhe/present-demo/tree/master/presentdemo
七牛作为一家紧跟技术趋势的云计算公司,从 React Native 发布以来就对该技术做了持续的跟进,在今年发布了官方版本的存储 SDK,帮助使用 React Native 创业的小伙伴们更便捷的使用七牛云存储,降低研发成本支出、专注商业模式和技术创新。七牛云将持续发布服务于企业的云服务,也会在第一时间发布 React Native 平台的 SDK,让使用 React Naitve 的小伙伴在第一时间集成七牛云的最新服务。
RN 上传文件到以及上传文件到七牛云(初步)的更多相关文章
- 七牛云上传视频并截取第一帧为图片(js实现)
本文出自APICloud官方论坛, 感谢论坛版主 东冥羽的分享. 七牛云上传视频并截取第一帧作为视频的封面图. 使用js上传,模块videoPlayer截取第一帧(有专门的截图模块,但是我使用的有点问 ...
- PHP搭建大文件切割分块上传功能
背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...
- Dropzone.js实现文件拖拽上传
dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件.支持最大文件大小.支持设置文件类型.支持预览上传结果,不依赖jQuery库. 使用Dropzo ...
- Java实现FTP文件与文件夹的上传和下载
Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...
- 文件上传之——用SWF插件实现文件异步上传和头像截取
之前写过几篇文件上传,那些都不错.今天小编带领大家体会一种新的上传方法,及使用Flash插件实现文件上传. 使用Flash的好处就是可以解决浏览器兼容性问题.之前我写的一个快捷复制功能也是利用的Fla ...
- php实现文件上传与下载(上)
php实现文件的上传与下载是一个挺基本的功能,一般网站多多少少都会有这样的需求在内,当然不是说所有的文件都可以被上传,那这网络就太没有安全性可言了.因为接触php时间不长,今天写练练手,随笔也就是公开 ...
- PHP 图片上传工具类(支持多文件上传)
====================ImageUploadTool======================== <?php class ImageUploadTool { private ...
- Android上传文件至服务器(上)
每一次都不能上首页,真悲催..管理员让我上一次首页? 很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构. 整洁的代码简单直接.整洁的代码如同优美的散文.整洁的代码从不隐藏设计者的 ...
- 文件上传---普通文件fileupload.jar和url文件httpUrlConnection
文件上传---普通文件和url文件 主要用来学习使用common-fileupload.jar和java.net.httpURLConnection 普通文件: //上传xls文件到临时目录 if ( ...
随机推荐
- mysqldump 使用小结
语法: 备份某个数据库: mysqldump -uroot -p*** [options] –-databases DB_name > back_db_name.sql --databases: ...
- shell脚本一键安装redis
支持识别离线包和联网安装,自动修改使用后台运行模式,离线安装的方法是,将离线包和脚本放在同一个文件夹, 它会先识别有没有离线包, 有离线包就先安装离线包, 没有离线包就安装进行判断机器是否能联网, 能 ...
- python3 logging模块
很多程序都有记录日志的需求,并且日志包含的信息有正常的程序访问日志还可能有错误,警告等信息输出,python的logging模块提供了标准的日志接口,可以通过它存储各种格式的日志,日志级别等级:cri ...
- mint-ui之toast使用(messagebox,indicator同理)
toast为消息提示框,支持自定义位置.持续时间和样式. 一,注意事项 方法1 引入整个 Mint UI 组件,并需要再次单独引入Toast组件 Toast,它并不是一个全局变量,需要先引入 im ...
- Centos7.03搭建JDK、Tomcat、MySql环境
本人linux服务器配置是:centos_7_03_64_20G_xdragon_20171025.vhd 公网IP:106.14.14.224 内存:2GB SecureCRT8.0:https:/ ...
- Android Java层,Native层,Lib层打印Log简介【转】
本文转载自:https://blog.csdn.net/AndroidMage/article/details/52225068 说明: 这里我根据个人工作情况说明在各个层打印log.如有问题欢迎拍砖 ...
- Docker 搭建Spark 依赖singularities/spark:2.2镜像
singularities/spark:2.2版本中 Hadoop版本:2.8.2 Spark版本: 2.2.1 Scala版本:2.11.8 Java版本:1.8.0_151 拉取镜像: [root ...
- 【做题】arc080_f-Prime Flip——转换、数论及匹配
题意:有一个无限序列,其中有\(n\)个位置上的数为\(1\),其余都是\(0\).你可以进行若干次操作,每次选取序列上的一个区间\([l,r)\),满足\(r-l\)为奇质数,将在这个区间上的数都异 ...
- 【安装】Matlab7.0简介及安装
一.简介 Matlab下载官方版是美国MathWorks公司出品的商业数学软件,Matlab7.0下载官方版用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MAT ...
- android 控件获取 获取焦点
控件.setEnabled(true);控件.setFocusable(true);控件.setFocusableInTouchMode(true);控件.requestFocus();控件.requ ...