文章目录
- 前言
- 一、数据交换方式
- 二. formdata包装数据
- 三.完整代码
- 解析一
- 解析二
- 参考文章
前言
折腾了一段时间,发现在strapi上传文件是出名的困难,而且官方文档上传文件教程也没有针对react native的部分,仅仅通过它的nodejs和browser代码在rn中套用行不通,其中还有些细节的纰漏。
开始前请确保自己已经按照官方教程安装好strapi
提示:以下是本篇文章正文内容,下面案例可供参考
一、数据交换方式
react native 中你可以使用自带的fetch函数进行数据通信,不过这里我用了apisauce,这个库操作更方便简洁。
下载指令:npm i apisauce
// import { create } from 'apisauce' // 定义api,这里的baseURL是必须的,它会作为一个根地址,headers可选,他会在以后每次发送数据的时候加上。如果你发送的stapi地址有开token用户密钥必须加X-API-KEY const api = create({ baseURL: 'http://xxx.xxx.xxx.xxx:1337/', //填上你自己的根地址 headers: { 'X-API-KEY': '这里填你的token' }, }) // 接收数据 api .get('/moments?populate=*') .then(console.log) // 发送数据,三个参数一地址,二数据,三附加headers,如果create时有headers,这里的headers只会附加上去,不会覆盖。 api.post('/users', { name: 'steve' }, { headers: { 'x-gigawatts': '1.21' } })
二. formdata包装数据
在react native 中上传文件到服务器需要使用formdata对数据进行包装。其实打包完就是一个字典一样的东西{{},{}}
简单介绍一下用法
const form = new FormData() form.append('data', JSON.stringify({ title: 'new' }))
注意:append接收两个参数,key和data,data的类型只能是string,blob或file.
三.完整代码
代码如下:
const uploadImage = ( name, uri, type) => { const form = new FormData() form.append('data', JSON.stringify({ title: 'new' })) form.append('files.image', { name: name, type: type, uri: Platform.OS === 'ios' ? uri.replace('file://', '') : uri, }) const headers = { 'Content-Type': 'multipart/form-data', } return api.post('/moments', form, { headers }) }
解析一
如果上传的是非文件类型的数据,在form.append中这个key必须是‘data’,而且需要用JSON.stringify()将数据转换为字符串;如果要上传各类文件(视频图片等),这个key必须是files,;如果你是把文件上传到strapi指定的entry中,那这个key就是files.[name],比如我这里的文件是一个图片,给他的name就是image,那key就是 files.image
解析二
对于如何在rn中配置好文件的数据形式,strapi文档中是没有详细指出的。不过我在油管的这个视频找到了答案:How to Upload File/Image to Server with Form Data in React Native
记住这个数据形式
{name: filename, //你上文件的文件名,可以自定义,例如 test.jpg type: mimetype, //mime文件类型,例如 image/jpg uri: localfilepath //如果是本地文件直接填上本地文件路径就好,不过注意安卓中一定要在文件路径前面加上file://,ios不用 }
所有mime type 参考mdn mime
参考文章
strapi upload
How to upload an image from a URL in React Next.js to Strapi
github Uploading files with apisauce #37
Upload photo from react native app to strapi api