react native实现往服务器上传网络图片的实例


Posted in Javascript onAugust 07, 2017

如下所示:

let common_url = 'http://192.168.1.1:8080/'; //服务器地址
let token = '';  //用户登陆后返回的token
/** 
 * 使用fetch实现图片上传
 * @param {string} url 接口地址
 * @param {JSON} params body的请求参数
 * @return 返回Promise 
 */
function uploadImage(url,params){
  return new Promise(function (resolve, reject) {
    let formData = new FormData();
    for (var key in params){
      formData.append(key, params[key]);
    }
    let file = {uri: params.path, type: 'application/octet-stream', name: 'image.jpg'};
    formData.append("file", file);
    fetch(common_url + url, {
      method: 'POST',
      headers: {
        'Content-Type': 'multipart/form-data;charset=utf-8',
        "x-access-token": token,
      },
      body: formData,
    }).then((response) => response.json())
      .then((responseData)=> {
        console.log('uploadImage', responseData);
        resolve(responseData);
      })
      .catch((err)=> {
        console.log('err', err);
        reject(err);
      });
  });

使用方法

let params = {
  userId:'abc12345',  //用户id
  path:'file:///storage/emulated/0/Pictures/image.jpg'  //本地文件地址
}
uploadImage('app/uploadFile',params )
  .then( res=>{
    //请求成功
    if(res.header.statusCode == 'success'){
      //这里设定服务器返回的header中statusCode为success时数据返回成功
      upLoadImgUrl = res.body.imgurl; //服务器返回的地址
    }else{
       //服务器返回异常,设定服务器返回的异常信息保存在 header.msgArray[0].desc
      console.log(res.header.msgArray[0].desc);
    }
  }).catch( err=>{ 
     //请求失败
  })

注意点

let file = {uri: params.path, type: 'application/octet-stream', name: 'image.jpg'}中的type也可能是multipart/form-data
formData.append("file", file)中的的file字段也可能是images

普通网络请求参数是JSON对象

图片上传的请求参数使用的是formData对象

总结:

React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRequest 是一个设计粗糙的 API,不符合职责分离的原则,配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise 友好。而Fetch 的出现就是为了解决 XHR 的问题,所以react Native官方推荐使用Fetch API。

fetch请求示例如下:

return fetch('http://facebook.github.io/react-native/movies.json')
  .then((response) => response.json())
  .then((responseJson) => {
   return responseJson.movies;
  })
  .catch((error) => {
   console.error(error);
  });

使用Promise封装fetch请求

let common_url = 'http://192.168.1.1:8080/'; //服务器地址
let token = '';  
/**
 * @param {string} url 接口地址
 * @param {string} method 请求方法:GET、POST,只能大写
 * @param {JSON} [params=''] body的请求参数,默认为空
 * @return 返回Promise
 */
function fetchRequest(url, method, params = ''){
  let header = {
    "Content-Type": "application/json;charset=UTF-8",
    "accesstoken":token //用户登陆后返回的token,某些涉及用户数据的接口需要在header中加上token
  };
  console.log('request url:',url,params); //打印请求参数
  if(params == ''){  //如果网络请求中没有参数
    return new Promise(function (resolve, reject) {
      fetch(common_url + url, {
        method: method,
        headers: header
      }).then((response) => response.json())
        .then((responseData) => {
          console.log('res:',url,responseData); //网络请求成功返回的数据
          resolve(responseData);
        })
        .catch( (err) => {
          console.log('err:',url, err);   //网络请求失败返回的数据    
          reject(err);
        });
    });
  }else{  //如果网络请求中带有参数
    return new Promise(function (resolve, reject) {
      fetch(common_url + url, {
        method: method,
        headers: header,
        body:JSON.stringify(params)  //body参数,通常需要转换成字符串后服务器才能解析
      }).then((response) => response.json())
        .then((responseData) => {
          console.log('res:',url, responseData);  //网络请求成功返回的数据
          resolve(responseData);
        })
        .catch( (err) => {
          console.log('err:',url, err);  //网络请求失败返回的数据 
          reject(err);
        });
    });
  }
}

使用fetch请求,如果服务器返回的中文出现了乱码,则可以在服务器端设置如下代码解决:

produces="text/html;charset=UTF-8"

fetchRequest使用如下:
GET请求:
fetchRequest('app/book','GET')
  .then( res=>{
    //请求成功
    if(res.header.statusCode == 'success'){
      //这里设定服务器返回的header中statusCode为success时数据返回成功

    }else{
      //服务器返回异常,设定服务器返回的异常信息保存在 header.msgArray[0].desc
      console.log(res.header.msgArray[0].desc);
    }
  }).catch( err=>{ 
    //请求失败
  })

POST请求:

let params = {
  username:'admin',
  password:'123456'
}
fetchRequest('app/signin','POST',params)
  .then( res=>{
    //请求成功
    if(res.header.statusCode == 'success'){
      //这里设定服务器返回的header中statusCode为success时数据返回成功

    }else{
      //服务器返回异常,设定服务器返回的异常信息保存在 header.msgArray[0].desc 
      console.log(res.header.msgArray[0].desc);
    }
  }).catch( err=>{ 
    //请求失败
  })

fetch超时处理

由于原生的Fetch API 并不支持timeout属性,如果项目中需要控制fetch请求的超时时间,可以对fetch请求进一步封装实现timeout功能,代码如下:

fetchRequest超时处理封装

/**
 * 让fetch也可以timeout
 * timeout不是请求连接超时的含义,它表示请求的response时间,包括请求的连接、服务器处理及服务器响应回来的时间
 * fetch的timeout即使超时发生了,本次请求也不会被abort丢弃掉,它在后台仍然会发送到服务器端,只是本次请求的响应内容被丢弃而已
 * @param {Promise} fetch_promise  fetch请求返回的Promise
 * @param {number} [timeout=10000]  单位:毫秒,这里设置默认超时时间为10秒
 * @return 返回Promise
 */
function timeout_fetch(fetch_promise,timeout = 10000) {
  let timeout_fn = null; 

  //这是一个可以被reject的promise
  let timeout_promise = new Promise(function(resolve, reject) {
    timeout_fn = function() {
      reject('timeout promise');
    };
  });

  //这里使用Promise.race,以最快 resolve 或 reject 的结果来传入后续绑定的回调
  let abortable_promise = Promise.race([
    fetch_promise,
    timeout_promise
  ]);

  setTimeout(function() {
    timeout_fn();
  }, timeout);

  return abortable_promise ;
}

let common_url = 'http://192.168.1.1:8080/'; //服务器地址
let token = '';  
/**
 * @param {string} url 接口地址
 * @param {string} method 请求方法:GET、POST,只能大写
 * @param {JSON} [params=''] body的请求参数,默认为空
 * @return 返回Promise
 */
function fetchRequest(url, method, params = ''){
  let header = {
    "Content-Type": "application/json;charset=UTF-8",
    "accesstoken":token //用户登陆后返回的token,某些涉及用户数据的接口需要在header中加上token
  };
  console.log('request url:',url,params); //打印请求参数
  if(params == ''){  //如果网络请求中没有参数
    return new Promise(function (resolve, reject) {
      timeout_fetch(fetch(common_url + url, {
        method: method,
        headers: header
      })).then((response) => response.json())
        .then((responseData) => {
          console.log('res:',url,responseData); //网络请求成功返回的数据
          resolve(responseData);
        })
        .catch( (err) => {
          console.log('err:',url, err);   //网络请求失败返回的数据    
          reject(err);
        });
    });
  }else{  //如果网络请求中带有参数
    return new Promise(function (resolve, reject) {
      timeout_fetch(fetch(common_url + url, {
        method: method,
        headers: header,
        body:JSON.stringify(params)  //body参数,通常需要转换成字符串后服务器才能解析
      })).then((response) => response.json())
        .then((responseData) => {
          console.log('res:',url, responseData);  //网络请求成功返回的数据
          resolve(responseData);
        })
        .catch( (err) => {
          console.log('err:',url, err);  //网络请求失败返回的数据 
          reject(err);
        });
    });
  }
}

以上这篇react native实现往服务器上传网络图片的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在IE下获取object(ActiveX)的Param的代码
Sep 15 Javascript
JS 实现Json查询的方法实例
Apr 12 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
Mar 18 Javascript
AngularJS 自定义指令详解及示例代码
Aug 17 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
Dec 05 Javascript
JS瀑布流实现方法实例分析
Dec 19 Javascript
利用Blob进行文件上传的完整步骤
Aug 02 Javascript
JavaScript函数的4种调用方法实例分析
Mar 05 Javascript
微信小程序点击列表跳转到对应详情页过程解析
Sep 26 Javascript
vue实现在线翻译功能
Sep 27 Javascript
浅谈JS的原型和原型链
Jun 04 Javascript
关于React Native 无法链接模拟器的问题
Jun 21 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 #Javascript
ES6新增的math,Number方法
Aug 06 #Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
Aug 06 #Javascript
JS解析url查询参数的简单代码
Aug 06 #Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
Aug 06 #Javascript
JS中定位 position 的使用实例代码
Aug 06 #Javascript
Node.js 基础教程之全局对象
Aug 06 #Javascript
You might like
织梦模板标记简介
2007/03/11 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
php数组转成json格式的方法
2015/03/09 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JQuery Tips(2) 关于$()包装集你不知道的
2009/12/14 Javascript
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
jQuery中Ajax的get、post等方法详解
2015/01/20 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
JavaScript中创建对象的模式汇总
2016/04/19 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Python实现登陆文件验证方法
2018/10/06 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
C#中的验证控件有几种
2014/03/08 面试题
2014年教师节国旗下讲话稿
2014/09/10 职场文书
迎国庆演讲稿
2014/09/15 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
教研活动主持词
2015/07/03 职场文书
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript