React-Native 使用react-native-image-crop-picker选择图片并上传到nodejs服务器

1:先学习react-native-image-crop-picke的使用方法

导入 react-native-image-crop-picke
npm i react-native-image-crop-picker --save
react-native link react-native-image-crop-picker
引用 react-native-image-crop-picke
import ImagePicker from 'react-native-image-crop-picker';
调用 react-native-image-crop-picke的方法
//从相册中选择单张图片
//cropping是否切割
ImagePicker.openPicker({
            width: 300,
            height: 300,
            cropping: true
        }).then(image => {
            
        })

//从相册中选择多张图片
ImagePicker.openPicker({
            multiple: true
        }).then(images => {
            console.log(images);
        });

//拍照
ImagePicker.openCamera({
            width: 300,
            height: 400,
            cropping: true
        }).then(image => {
            console.log(image);
        });

//返回的资源对象(images):
path(string):图片地址
data(base64):图片base64格式数据流
mime(string):图片格式
width(number):图片宽度
height(number):图片高度
size(number):图片大小

2:xcode添加库和设置相册拍照权限

找到linked frameworks and libraries导入库:
RSKImageCropper.framework
QBImagePicker.framework
plist文件设置权限
访问相机:NSCameraUsageDescription   
访问相册:NSPhotoLibraryUsageDescription
使用效果1:
Untitled16.gif

3:上传图片

上传图片的方法
//url:params对象包含图片本地路径path
_uploadImage =(url, params)=> {
        return new Promise(function (resolve, reject) {
            var ary = params.path.split('/');
            console.log('2222222' + ary);
            //设置formData数据
            let formData = new FormData();
            let file = {uri: params.path, type: 'multipart/form-data', name: ary[ary.length-1]};
            formData.append("file", file);
            //fetch post请求
            fetch('http://localhost:8010/birds/' + url, {
                method: 'POST',
                //设置请求头,请求体为json格式,identity为未压缩
                headers: {
                    'Content-Type': 'application/json',
                    'Content-Encoding': 'identity'
                },
                body: JSON.stringify(formData),
            }).then((response) => response.json())
                .then((responseData)=> {
                    console.log('uploadImage', responseData);
                    resolve(responseData);
                })
                .catch((err)=> {
                    console.log('err', err);
                    reject(err);
                });
            });
    };
调用上传图片方法
//_imageObj为返回的资源对象(images)
_beginUpImage =()=> {
        let params = {
            path:  this._imageObj['path'],    //本地文件地址
        };
        this._uploadImage('uploadImage', params)
            .then( res=>{
                console.log('success');
            }).catch( err=>{
            //请求失败
            console.log('flied');
        })
    };

完整的reactNative代码:

import ImagePicker from 'react-native-image-crop-picker';
import React, { Component } from 'react';
import {
    AppRegistry,
    View,
    Text,
    TouchableOpacity,
    Image
} from 'react-native';

class RNCameraView extends Component {
   //初始化一个对象,path本地路径
    _imageObj = {
        path: '/Users/kk/XueXireactNativeDeDaiMa/SampleAppMovies/image/d11.png'
    };

    constructor(props) {
        super(props);
        this.state = {
            imageUrl: require('./image/d11.png')
        }
    }
    render() {
        return (
            <View style={{flex: 1, backgroundColor: '#aaffaa', alignItems: 'center', justifyContent: 'center'}}>
                <Image style={{width: 300, height: 300}}
                       source={this.state.imageUrl}/>

                <TouchableOpacity style={{width: 80, height: 60, backgroundColor: '#ffaaaa', marginTop: 20}}
                                  onPress={this._openPicker}>
                    <Text>从相册中选择单张图片</Text>
                </TouchableOpacity>
                <TouchableOpacity style={{width: 80, height: 60, backgroundColor: '#ffaaaa', marginTop: 20}}
                                  onPress={this._openTwoPicker}>
                    <Text>从相册中选择多张图片</Text>
                </TouchableOpacity>
                <TouchableOpacity style={{width: 80, height: 60, backgroundColor: '#ffaaaa', marginTop: 20}}
                                  onPress={this._openCamera}>
                    <Text>拍照</Text>
                </TouchableOpacity>
                <TouchableOpacity style={{width: 80, height: 60, backgroundColor: '#ffaa00', marginTop: 20}}
                                  onPress={this._beginUpImage}>
                    <Text>上传图片</Text>
                </TouchableOpacity>
            </View>
        )
    }

    _beginUpImage =()=> {
        let params = {
            path:  this._imageObj['path'],    //本地文件地址
        };
        this.uploadImage('uploadImage', params)
            .then( res=>{
                console.log('success');
            }).catch( err=>{
            //请求失败
            console.log('flied');
        })
    };

    uploadImage =(url, params)=> {
        return new Promise(function (resolve, reject) {
            var ary = params.path.split('/');
            console.log('2222222' + ary);
            let formData = new FormData();
            let file = {uri: params.path, type: 'multipart/form-data', name: ary[ary.length-1]};
            formData.append("file", file);

            fetch('http://localhost:8010/birds/' + url, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Content-Encoding': 'identity'
                },
                body: JSON.stringify(formData),
            }).then((response) => response.json())
                .then((responseData)=> {
                    console.log('uploadImage', responseData);
                    resolve(responseData);
                })
                .catch((err)=> {
                    console.log('err', err);
                    reject(err);
                });
            });
    };

    //从相册中选择单张图片:
    _openPicker =()=> {
        ImagePicker.openPicker({
            width: 300,
            height: 300,
            cropping: true
        }).then(image => {
            console.log("111111" + image['data']);
            this.setState({
                imageUrl: {uri: image['path']}
            });
            this._imageObj = image;
        })
    };
    //从相册中选择多张图片:
    _openTwoPicker =()=> {
        ImagePicker.openPicker({
            multiple: true
        }).then(images => {
            console.log(images);
        });
    };
    //拍照:
    _openCamera =()=> {
        ImagePicker.openCamera({
            width: 300,
            height: 400,
            cropping: true
        }).then(image => {
            console.log(image);
        });
    };
}
AppRegistry.registerComponent('RNCameraView', ()=>RNCameraView);

4:nodejs服务端接收数据

使用express框架,并添加body-parser依赖
var express = require('express');
var app = express();
//解析请求体body
var bodyParser = require('body-parser');
//fs读取和写入文件
var fs = require('fs');
//解析请求体格式
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

//设置路由
app.post('/uploadImage', function (req, res) {
    console.log('Content-Type====' + req.get('Content-Type'));
    var jsonBody = req.body;
    //解析jsonBody
    var file = jsonBody['_parts'][0][1];

    console.log('jsonBody=====' + JSON.stringify(jsonBody) + 'file====' + JSON.stringify(file));

    if(Object.keys(req.body).length<=0) {
        console.log('没有提交任何post参数');
    }

    var response;
    //设置写入文件的路径
    var des_file = __dirname + '/pubilc/images/' + file['name'];

    //读取文件地址
    fs.readFile(file['uri'], function (err, data) {
        //开始写入文件
        fs.writeFile(des_file, data, function (err) {
            if(err) {
                console.log(err);
                response = err;
            }else {
                response = {
                    message: 'File upload successfully',
                    fileName: file['name']
                }
            }
            console.log(response);
            res.end(JSON.stringify(response));
        })
    })
});

上传图片效果:

点击上传图片服务端得到数据:
9D1029AB-6425-44DB-96D6-1A4A6E1C9463.png
app端收到服务端返回数据:
19D33404-B4AC-49A5-B58C-F720DA63BF73.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容