React-Native 使用react-native-image-crop-picker選擇圖片并上傳到nodejs服務(wù)器

1:先學(xué)習(xí)react-native-image-crop-picke的使用方法

導(dǎo)入 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';
調(diào)用 react-native-image-crop-picke的方法
//從相冊(cè)中選擇單張圖片
//cropping是否切割
ImagePicker.openPicker({
            width: 300,
            height: 300,
            cropping: true
        }).then(image => {
            
        })

//從相冊(cè)中選擇多張圖片
ImagePicker.openPicker({
            multiple: true
        }).then(images => {
            console.log(images);
        });

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

//返回的資源對(duì)象(images):
path(string):圖片地址
data(base64):圖片base64格式數(shù)據(jù)流
mime(string):圖片格式
width(number):圖片寬度
height(number):圖片高度
size(number):圖片大小

2:xcode添加庫和設(shè)置相冊(cè)拍照權(quán)限

找到linked frameworks and libraries導(dǎo)入庫:
RSKImageCropper.framework
QBImagePicker.framework
plist文件設(shè)置權(quán)限
訪問相機(jī):NSCameraUsageDescription   
訪問相冊(cè):NSPhotoLibraryUsageDescription
使用效果1:
Untitled16.gif

3:上傳圖片

上傳圖片的方法
//url:params對(duì)象包含圖片本地路徑path
_uploadImage =(url, params)=> {
        return new Promise(function (resolve, reject) {
            var ary = params.path.split('/');
            console.log('2222222' + ary);
            //設(shè)置formData數(shù)據(jù)
            let formData = new FormData();
            let file = {uri: params.path, type: 'multipart/form-data', name: ary[ary.length-1]};
            formData.append("file", file);
            //fetch post請(qǐng)求
            fetch('http://localhost:8010/birds/' + url, {
                method: 'POST',
                //設(shè)置請(qǐng)求頭锡移,請(qǐng)求體為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);
                });
            });
    };
調(diào)用上傳圖片方法
//_imageObj為返回的資源對(duì)象(images)
_beginUpImage =()=> {
        let params = {
            path:  this._imageObj['path'],    //本地文件地址
        };
        this._uploadImage('uploadImage', params)
            .then( res=>{
                console.log('success');
            }).catch( err=>{
            //請(qǐng)求失敗
            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 {
   //初始化一個(gè)對(duì)象,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>從相冊(cè)中選擇單張圖片</Text>
                </TouchableOpacity>
                <TouchableOpacity style={{width: 80, height: 60, backgroundColor: '#ffaaaa', marginTop: 20}}
                                  onPress={this._openTwoPicker}>
                    <Text>從相冊(cè)中選擇多張圖片</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=>{
            //請(qǐng)求失敗
            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);
                });
            });
    };

    //從相冊(cè)中選擇單張圖片:
    _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;
        })
    };
    //從相冊(cè)中選擇多張圖片:
    _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服務(wù)端接收數(shù)據(jù)

使用express框架,并添加body-parser依賴
var express = require('express');
var app = express();
//解析請(qǐng)求體body
var bodyParser = require('body-parser');
//fs讀取和寫入文件
var fs = require('fs');
//解析請(qǐng)求體格式
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

//設(shè)置路由
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參數(shù)');
    }

    var response;
    //設(shè)置寫入文件的路徑
    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));
        })
    })
});

上傳圖片效果:

點(diǎn)擊上傳圖片服務(wù)端得到數(shù)據(jù):
9D1029AB-6425-44DB-96D6-1A4A6E1C9463.png
app端收到服務(wù)端返回?cái)?shù)據(jù):
19D33404-B4AC-49A5-B58C-F720DA63BF73.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末洪添,一起剝皮案震驚了整個(gè)濱河市拥褂,隨后出現(xiàn)的幾起案子赁咙,更是在濱河造成了極大的恐慌,老刑警劉巖照藻,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件袜啃,死亡現(xiàn)場離奇詭異,居然都是意外死亡幸缕,警方通過查閱死者的電腦和手機(jī)群发,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來发乔,“玉大人熟妓,你說我怎么就攤上這事±干校” “怎么了起愈?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長译仗。 經(jīng)常有香客問我抬虽,道長,這世上最難降的妖魔是什么纵菌? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任阐污,我火速辦了婚禮,結(jié)果婚禮上咱圆,老公的妹妹穿的比我還像新娘笛辟。我一直安慰自己,他們只是感情好序苏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布手幢。 她就那樣靜靜地躺著,像睡著了一般杠览。 火紅的嫁衣襯著肌膚如雪弯菊。 梳的紋絲不亂的頭發(fā)上纵势,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天踱阿,我揣著相機(jī)與錄音,去河邊找鬼钦铁。 笑死软舌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牛曹。 我是一名探鬼主播佛点,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了超营?” 一聲冷哼從身側(cè)響起鸳玩,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎演闭,沒想到半個(gè)月后不跟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡米碰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年窝革,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吕座。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虐译,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吴趴,到底是詐尸還是另有隱情漆诽,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布史侣,位于F島的核電站拴泌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惊橱。R本人自食惡果不足惜蚪腐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望税朴。 院中可真熱鬧回季,春花似錦、人聲如沸正林。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觅廓。三九已至鼻忠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杈绸,已是汗流浹背帖蔓。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞳脓,地道東北人塑娇。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像劫侧,于是被迫代替她去往敵國和親埋酬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哨啃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容