美文网首页
react-native 图片选择---单张与多张

react-native 图片选择---单张与多张

作者: 物联白菜 | 来源:发表于2021-07-05 12:08 被阅读0次

react-native-image-picker

 imagePicker() {
        let that = this;

        const options = {
            title: '选择一张图片',
            cancelButtonTitle: '取消',
            takePhotoButtonTitle: '拍照',
            chooseFromLibraryButtonTitle: '从相册中选择',
            quality: 1.0,
            maxWidth: 500,
            maxHeight: 500,
            storageOptions: {
                skipBackup: true
            }
        };
        ImagePicker.showImagePicker(options, (response)=> {
            if (response.didCancel) {

            }
            else if (response.error) {

            }
            else if (response.customButton) {
            }
            else {
                let source;
                let imageName;
                let imagePath;

                if (Platform.OS === 'android') {
                    source = response.uri;
                    imagePath = response.path;
                    imageName = response.fileName;

                } else {
                    //{"uri":"/var/mobile/Containers/Data/Application/CC01D123-59FA-4205-8B27-C3181596AA5C/Documents/6131CE7A-FD8C-44DB-B9B9-82C322294B88.jpg","isStatic":true}
                    //file:///Users/dev/Library/Developer/CoreSimulator/Devices/DA8C975D-D476-462B-B387-D43FBC55C333/data/Containers/Data/Application/6231A942-22AA-40DC-A303-898EDE2C7533/Documents/2E98BCB0-8A9E-43FF-88E6-E7BE2094EE62.jpg
                    source = response.uri.replace('file://', '');
                    imagePath = response.uri.replace('file://', '');
                    imageName = that.getImageNameByIOS(response.uri);
                }

                let imageinfo = [];
                imageinfo['uri'] = source;//这个是给React-native Image组件显示图片用得地址;
                imageinfo['imageName'] = imageName;//图片名称
                imageinfo['imagePath'] = imagePath;//图片在本机的路径.
                that.setState({
                    default_image: imageinfo,
                });
            }
        })
    }

react-native-image-crop-picker

    /**图片上传开始**/
import ActionSheet from "react-native-actionsheet";
import ImagePicker from "react-native-image-crop-picker";
import MyStroage from '../../common/myStroage';
import Util from '../../common/util'   //--工具
import * as URLconstant from '../../constant/URLconstant'  //  --接口


    constructor(props) {
        super(props);
        this.arrImg = []
        this.state = {
            photos:[],
        };
    }


    requestPermission = async () => {
        try {
            const granted = await PermissionsAndroid.request(
                PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
                {
                    title: '申请读写手机存储权限',
                    message:
                        '一个很牛逼的应用想借用你的摄像头,' +
                        '然后你就可以拍出酷炫的皂片啦。',
                    buttonNeutral: '等会再问我',
                    buttonNegative: '不行',
                    buttonPositive: '好吧',
                },
            );
            if (granted === PermissionsAndroid.RESULTS.GRANTED) {
                console.log('现在你获得摄像头权限了');
            } else {
                console.log('用户并不给你');
            }
        } catch (err) {
            console.warn(err);
        }
    };

    //吊起选择框
    async _imagePicker(isMultiple){

        await this.requestPermission();
        let newPhotos = this.state.photos

        this.setState({
            isMultiple:isMultiple
        })

        if(newPhotos.length>=6){
            Toast.show("图片最多为6张")
            return
        }
        this.ActionSheet.show()
    }

    //相册选择
    selectFromAlbum(){
        console.warn('您选择的是相册')

        let isMultiple = this.state.isMultiple

        ImagePicker.openPicker({
            multiple: isMultiple
        }).then(photos => {
            console.warn('选中的图片===',photos);
            this.setState({
                isLoading:true
            })

            if(isMultiple){    //true   为多选
                let arr = this.state.photos
                photos.map((item,id)=>{
                    console.warn('选中的图片item===',item);
                    arr.push(item)
                    this.uploadImage(item.path)
                })
                console.warn('选中的图片arr===',arr)
                this.setState({
                    photos:arr
                })
            }else{
                this.uploadImage(photos.path)
                this.setState({
                    headerImg:photos
                })
            }
        }).catch((e)=>{
            console.warn("取消选择",e)
        });

    }

    //相机拍摄
    selectphotograph(){
        console.warn('选择的是相机拍摄')
        let newPhotos = this.state.photos
        let isMultiple = this.state.isMultiple

        if(newPhotos.length===3){
            alert("图片最多为3张")
            return
        }
        ImagePicker.openCamera({
            width: 300,
            height: 400,
            cropping: true,
        }).then(photos => {
            console.log(photos);

            if(isMultiple) {    //true   为多选
                let arr = newPhotos.concat(photos)
                this.setState({
                    photos: arr,
                    // imgNameArr:imageArr
                });
                let newArr = this.state.photos
                console.warn('newPhotosArr==',newArr,'newPhotosArr.length===',newArr.length)
                this.uploadImage(photos.path,newArr.length)
            }else{
                this.setState({
                    headerImg:photos
                })
            }
        });
    }


    //上传图片到阿里云
    uploadImage(sourceUri,length) {
        console.log('sourceUri===',sourceUri)
        let url = URLconstant.UPLOAD_IMAGE
        let datakey = []
        let upload_photo = {
            uri: sourceUri,   //本地路径
            type: "multipart/form-data",
            name: this.backName(sourceUri)
        }
        datakey['image_file_storeImageUpload'] = upload_photo

        let isMultiple = this.state.isMultiple

        Util.post(url, datakey, (datas) => {
            // LOG('res===多张图片上传到阿里云成功' + JSON.stringify(datas))

            if (datas.status == 0) {

                if(isMultiple){ //true为多选
                    this.arrImg.push(datas.data.image_url)
                }else{
                    this.headImg = datas.data.image_url
                }
                console.warn('最终的上传完成的图片数组===',this.arrImg)
                setTimeout(()=>{
                    this.setState({
                        isLoading:false
                    })
                },1000)

                this.saveImageWithTag(datas.data.image_url)
            } else {
                Toast.show(datas.msg)
            }
        }, (err) => {
            LOG(err)
        })
    }
    backName(res) {
        // LOG('res===多张图片上传到阿里云' + res)
        return res.split('/').pop()
    }

    saveImageWithTag(uri) {
        if (Platform.OS === 'android') {
            // SaveModule.initSave(uri);

        } else {
            CameraRoll.saveToCameraRoll(uri, 'photo').done(function (data) {
                LOG("保存图片成功 data==" + data);
                Toast.show("保存图片成功", 2);
            }, function (err) {

                LOG("保存图片失败 err==" + err);
                Toast.show("保存图片失败", 2);

            });
        }
    }

    deletePhotos(item,id){
        let photos = this.state.photos
        // console.log('删除照片',item)
        // console.log('this.arrImg==',this.arrImg)
        this.arrImg.splice(id,1)
        photos.splice(id,1)
        // console.log('this.arrImg1==',this.arrImg)
        this.setState({
            photos:photos,
        })

    }

    /**图片上传结束**/
                            <View style={{flexDirection:'row',flexWrap:'wrap'}}>
                                {
                                    this.state.photos.map((item, index) => {
                                        let source = {uri: item.path};
                                        if (item.enableBase64) {
                                            source = {uri: item.base64};
                                        }
                                        return (
                                            <View key={index} style={{
                                                width:Util.size.width/8,  
                                                height:Util.size.width/8,
                                                marginTop:(Util.size.width-(Util.size.width/3.2)*3)/3-14,
                                                marginRight:(Util.size.width-(Util.size.width/3.2)*3)/3-14,
                                                position:'relative'
                                            }}>
                                                <TouchableOpacity
                                                    onPress={()=>this.deletePhotos(item,index)}
                                                    activeOpacity={1}
                                                    style={{width:18,height:18,borderRadius:999,backgroundColor:'#ddd',position:'absolute',zIndex:1,right:-4,top:-10,justifyContent:'center',alignItems:'center'}}>
                                                    <Text style={{fontSize:15,top:-1}}>×</Text>
                                                </TouchableOpacity>
                                                <Image
                                                    key={`image-${index}`}
                                                    style={{width:'100%',height:'100%',borderRadius:5,}}
                                                    source={source}
                                                    resizeMode={'cover'}
                                                />
                                            </View>
                                        );
                                    })
                                }
                                <TouchableOpacity onPress={()=>this._imagePicker(true)} style={{
                                    height: Util.size.width/8,
                                    width:Util.size.width/8,
                                    justifyContent:'center',alignItems:'center', backgroundColor: '#F5F6FC',
                                    marginTop:(Util.size.width-(Util.size.width/3.2)*3)/3-14,
                                    marginRight:(Util.size.width-(Util.size.width/3.2)*3)/3-14,
                                    borderRadius: 10 }}>
                                    <Text style={{fontSize:50,fontWeight:'bold',color:'#C7C8D3'}}>+</Text>
                                </TouchableOpacity>
                            </View>



                        {/*图片选择*/}
                        <ActionSheet
                            ref={o => this.ActionSheet = o}
                            title={'请选择照片类型'}
                            options={['选择相册', '相机', '取消']}
                            cancelButtonIndex={2}
                            destructiveButtonIndex={1}
                            onPress={(index) => { if(index===0){this.selectFromAlbum()}else if(index===1){this.selectphotograph()} }}
                        />

POST 提交图片

//多图以 xxx.jpg,xxx.jpg,xxx.jpg拼接

        //图片
        let imgNameArr = this.arrImg
        let imgStr = ''
        imgNameArr.map((item,id)=>{
            id > 0 ? imgStr += ',' + item : imgStr = item
        })

相关文章

网友评论

      本文标题:react-native 图片选择---单张与多张

      本文链接:https://www.haomeiwen.com/subject/fwwbultx.html