004-React-Native--多图选择上传
参考资料:http://www.jianshu.com/p/488e62ed9656
一:使用react-native-image-crop-picker进行图片选择时,并没有提供多图的机制。
当你从相机选择图片时,会覆盖之前已经存在的图片。所以,今天,来一个多图选择并上传的例子,此例子中,会保存你之前已经选择的图片。例如,当前列表已经存在一张照片,当你去相册或者使用相机进行拍照时,不会覆盖当前列表已经存在的照片。二:使用FormData进行图片上传,并根据需要进行其他参数的添加
三: Coding
pic.gif//第三方库,需要使用npm引入
import ImagePicker from 'react-native-image-crop-picker';
import ActionSheet from '../../components/ActionSheet/ActionSheet'
import Config from '../../../Config' import ModalProgress from '../../components/Progress/ModalProgress' //存放数组
var dataToPost = []; export default class LoadingPage extends React.Component {
static navigationOptions = ({ navigation }) => {
const {state} = navigation;
return {
title: '上传信息',
headerRight: (
<Button
title="上传"
onPress={()=>{
state.params.commitPage();
}}
/>
),
};
}; componentWillMount(){
this.props.navigation.setParams({
commitPage:this.commitPage,
})
}
constructor(props){
super(props);
this.state={
images: [],
}
}
show() {
let items = [
{title: '从相册选取', onPress: () => this.openPicLib()},
{title: '拍照一张',onPress: () => this.pickSingleWithCamera()},
];
let cancelItem = {title: '关闭'};
ActionSheet.show(items, cancelItem);
} render(){
return(
<ScrollView>
<View>
<View>
<View style={styles.viewPadding}>
{this.createImageItem()}
</View>
</View>
<View style={styles.itemLine}/>
</View>
</ScrollView>
)
} createImageItem(){
let imageSource = require('../../imgs/upload.png');
let mainView;
if(this.state.images!=null&&this.state.images.length>=9){
mainView=null;
}else{
mainView= <TouchableOpacity
onPress={()=>{
this.show();
}}>
<Image source={imageSource} />
</TouchableOpacity>
} return(
<View>
<View>
{this.state.images ? this.state.images.map(i => <View key={i.uri}>{this.renderImage(i)}</View>) : null}
</View>
<View>
{mainView}
</View>
</View>
)
} //从相机获取图片
pickSingleWithCamera=()=> {
ImagePicker.openCamera({
cropping: false,
width: Math.round((Dimensions.get('window').width-20)),
height: 300,
}).then(image => {
dataToPost.push({
uri: image.path,
width: image.width,
height: image.height,
});
this.setState({
images: dataToPost
});
}).catch(
e => alert(e)
);
} //从图库或者相机进行获取,因为安卓平台不能进行多图选择,所以,需要区分不同平台
openPicLib=()=> {
if(Platform.OS === 'ios'){
ImagePicker.openPicker({
multiple: true,
waitAnimationEnd: false,
}).then(images => {
for (var i=0;i<images.length;i++) {
dataToPost.push({
uri: images[i].path,
width: images[i].width,
height: images[i].height,
mime: images[i].mime,
});
}
this.setState({
images: dataToPost
});
}).catch(e =>
alert(e)
); }else{
ImagePicker.openPicker({
width: 300,
height: 300,
cropping: false,
cropperCircleOverlay: false,
compressImageMaxWidth: 480,
compressImageMaxHeight: 640,
compressImageQuality: 0.5,
mediaType: 'photo',
compressVideoPreset: 'MediumQuality'
}).then(image => {
dataToPost.push({
uri: image.path,
width: image.width,
height: image.height,
mime: image.mime
});
this.setState({
images: dataToPost
});
}).catch(e => {
Alert.alert(e.message
? e.message
: e);
});
}
} renderImage(image) {
return <Image style={{width: 100, height: 100, resizeMode: 'contain'}} source={image} />
} //数据提交
commitPage=()=>{
let formData = new FormData();
if(this.state.images == null){
alert("没有选择图片");
} else {
for(var i = 0;i<this.state.images.length;i++){
var uri = this.state.images[i].uri;
var index = uri.lastIndexOf("\/");
var name = uri.substring(index + 1, uri.length);
let file = {uri: uri, type: 'multipart/form-data', name: name } ;
formData.append('file', file);
}
} //上传图片时,可以在此添加相关其他参数
formData.append('userId', '1');
formData.append('fileType', 'image');
formData.append('name','time');
formData.append('phone', '11222222'); ModalProgress.show("数据上传中,请稍后....");
const REQUEST_URL = Config.domain+'/upload/uploadQualifications';
fetch(REQUEST_URL,{
method:'POST',
headers:{
'Content-Type':'multipart/form-data',
'Accept': 'application/json'
},
body:formData,
}).then((response) => response.json()).then((responseJson) => {
alert(JSON.stringify(responseJson));
if (responseJson.status == 0) {
ModalProgress.hide();
{this.goBack()}
}else{
ModalProgress.hide();
alert(responseJson.msg);
}
}).catch((error) => {
alert(error);
ModalProgress.hide();
}); }
}
image.png作者:Time_二胡
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
004-React-Native--多图选择上传的更多相关文章
- 没有选择上传的文件或选择的文件大小超出大小(DEDECMS亲身试验成功)
dedecms升级到5.7后,后台上传压缩包文件,提示"没有选择上传的文件或选择的文件大小超出大小",由于很久都没弄这个系统了,所以最早怎么设置的也忘记了,就上百度搜,基本上有说的 ...
- Ext.js多文件选择上传,
工作了之后来到了一家用Ext.js的公司, 一开始的时候做项目, 我被分给一个做一个单表的增删改查, 再加上文件上传功能, 带我的老师让我自己研究一下Ext.js怎么多文件选择上传, 并且能获取到上传 ...
- 关于React Native项目在android上UI性能调试实践
我们尽最大的努力来争取使UI组件的性能如丝般顺滑,但有的时候这根本不可能做到.要知道,Android有超过一万种不同型号的手机,而在框架底层进行软件渲染的时候是统一处理的,这意味着你没办法像iOS那样 ...
- SpringMvc+jQuery 文件拖拽上传、选择上传
最近做了个简易的基于boostrap的文件上传功能,jsp版本的,后续会完善更多的功能,不过现在已经能用了,需要的小伙伴,直接引用下面的文件内容直接copy到自己的项目中就ok了,效果如图: file ...
- 帝国CMS7.2新增多图同时上传插件,上传多图效率更高
原来上传多图文件,需要挨个选择文件,然后再点批量上传,比较麻烦.所以帝国CMS7.2新增了多图上传插件:为采用FLASH方式实现同时选择多个图片一起上传,提高多图上传效率. 帝国CMS多图上传插件特性 ...
- Typora图床上传配置:PicGo+Gitee 不完全指南
每次写Markdown都要手动传图,再复制链接到Typora里,这样比较繁琐. 设置好图床,搭配PicGo,写作时直接剪贴图片到Typora,就能实现自动上传,这样就方便很多. Gitee配置: 许多 ...
- js前端实现多图图片上传预览
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- 关于阿里ICON矢量图(SVG)上传问题.
注意点: 1. 存储为svg格式(建议使用存储为svg,不要使用导出为svg)2. 图像位置:链接(注意哦,不要点嵌入和保留编辑功能)---确定3. AI里面选中图形,点对象-路径-轮廓化描边 软件编 ...
- React + js-xlsx构建Excel文件上传预览功能
首先要准备react开发环境以及js-xlsx插件 1. 此处省略安装react安装步骤 2.下载js-xlsx插件 yarn add xlsx 或者 npm install xlsx 在项目中引入 ...
随机推荐
- echarts初探
最近经常看到echarts,觉得很有意思,并且这个库是百度开发的,目前来说使用的也很广泛,包括百度.阿里.腾讯.网易.小米.新浪.华为.联想.美团等一大批一线互联网公司在使用,且github上的sta ...
- todolist增加markdown模块
markdown编辑器 利用`markdown_js`开源库实现todolist小项目的markdown日记本功能 todolist小项目地址 之前的介绍随笔todoList markdown-js仓 ...
- 关于eclipse 在创建一个新项目时自动出现的appcompat v7如何解决
参考链接:https://blog.csdn.net/u013146742/article/details/51446438 我安装的ADT版本是23.0.2的新建的Android项目会自动带个app ...
- 牛客网Java刷题知识点float数据在内存中是怎么存储的
不多说,直接上干货! float类型数字在计算机中用4个字节存储. 遵循IEEE-754格式标准: 一个浮点数有2部分组成:底数m和指数e (1)底数部分 使用二进制数来表示此浮点数的实际值 (2)指 ...
- PHP多进程系列笔记(五)
前面几节都是讲解pcntl扩展实现的多进程程序.本节给大家介绍swoole扩展的swoole_process模块. swoole多进程 swoole_process 是swoole提供的进程管理模块, ...
- C#中将String类型保存到本地文件的方法
今天刚刚遇到,要在WinForm中把一个xml保存到本地, 由于之前是学习java的,一时间还真不知道怎么写, 没想到C#居然那么方便,就3句代码就实现了我要的功能: StreamWriter sw ...
- 揭开Future的神秘面纱——结果获取
前言 在前面的两篇博文中,已经介绍利用FutureTask任务的执行流程,以及利用其实现的cancel方法取消任务的情况.本篇就来介绍下,线程任务的结果获取. 系列目录 揭开Future的神秘面纱—— ...
- Java设计模式学习记录-代理模式
代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...
- POJ 2262 Goldbach's Conjecture (打表)
题目链接: https://cn.vjudge.net/problem/POJ-2262 题目描述: In 1742, Christian Goldbach, a German amateur mat ...
- zoj 1151 Word Reversal(字符串操作模拟)
题目连接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1151 题目描述: For each list of words ...