zoukankan      html  css  js  c++  java
  • react native android 上传文件,Nodejs服务端获取上传的文件

    React Native端

    使用react-native-image-picker 做出选择图片的操作,选择完成后,直接将图片Post至服务器,保存在服务器的某个地方(保存图片的路径需要公开显示),并返回图片的URL地址,Android应用中,只保存图片的URL地址。

    component中代码

    _chooseImage() {
            ImagePicker.showImagePicker(options, (response) => {
                console.log('Response = ', response);
    
                if (response.didCancel) {
                    console.log('用户取消了选择!');
                }
                else if (response.error) {
                    alert("ImagePicker发生错误:" + response.error);
                }
                else if (response.customButton) {
                    alert("自定义按钮点击:" + response.customButton);
                }
                else {
                    // let source = { uri: response.uri };
                    try {
    
                        console.log(response);
    
                        uploadImage(response.uri, response.fileName, this.state.userEntity.token).then((imageUrl) => {
                            console.log(imageUrl);
                            //http://f11.baidu.com/it/u=3806443343,4236894804&fm=72
                            // You can also display the image using data:
                            let source = { uri: 'data:image/jpeg;base64,' + response.data };
                            let oldselectIssueData = this.state.selectIssueData;
                            oldselectIssueData.IssueImageList.push({ uri: imageUrl });
    
                            console.log('设置后')
                            this.setState({
                                selectIssueData: oldselectIssueData
                            });
    
                        }).catch((err) => {
                            throw err;
                        })
    
    
                    } catch (error) {
                        Alert.alert('选择图片错误', error.message);
                    }
                }
            });
        }

    公共方法 uploadFile.js

    import { default_API_url } from '../config/index';
    
    export function uploadImage(imageUri, imageName, token) {
        return new Promise((resolve, reject) => {
            let data = new FormData()
            if (imageUri) {
                data.append('image', { uri: imageUri, name: imageName, type: 'image/jpg' })//加入图片
            }
            const config = {
                method: 'POST',
                headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'multipart/form-data',
                    // 'Content-Language': React.NativeModules.RNI18n.locale,
                    'Authorization': token,
                },
                body: data,
            }
            fetch(default_API_url + '/fittingImage', config)
                .then(function (response) {
                    return response.json();
                }).then((responseData) => {
                    console.log('responseData', responseData);
                    if (responseData.resultType == 'SUCCESS') {
                        return resolve(default_API_url + '/' + responseData.results.imageName);//返回的是文件名,这里将它加入服务器的名称
                    } else {
                        return reject(responseData.resultMsg || 'Unknow Error');
                    }
                }).catch((error) => {
                    return reject(error);
                });
        });
    }
    
    export default uploadImage;

    Nodejs端,后端使用multer作为上传文件中间件,参考地址:http://cnodejs.org/topic/564f32631986c7df7e92b0dbhttps://dzone.com/articles/upload-files-or-images-to-server-using-nodejs

    service.js中,增加

    app.use(express.static(config.fittingImagePath));//公开某个文件夹

    router中的方法:

    exports.UploadFittingImage = (req, res) => {
        try {
    
            upload(req, res, function (err) {
                if (err) {
                    return res.json({ url: err.message })
                }
                logger.info('req.files---------------------', req.files[0].filename)//因为支持的是多文件上传,这里我返回的是第一个文件名
                return res.status(200).json(responseFormat(null, { imageName: req.files[0].filename }));
            });
        }
        catch (error) {
            return res.status(400).json(responseFormat(error, null));
        }
    };

    公共方法fileUpload.js

    import multer from 'multer';
    import Config from 'config-lite';
    let config = Config(__dirname);
    
    let Storage = multer.diskStorage({
        destination: function (req, file, callback) {//文件保存位置,我这里是配置的
            callback(null, "./" + config.fittingImagePath);
        },
        filename: function (req, file, callback) {//重命名文件
            callback(null, file.fieldname + "_" + Date.now() + "_" + file.originalname);
        }
    });
    
    let upload = multer({
        storage: Storage
    }).array("image", 1); //Field name and max count
    //导出对象
    module.exports = upload;

     整体的流程

  • 相关阅读:
    光场显微成像----整理
    清华大学自动化系友论坛——光电智能计算:笔记
    大创记录——Day3.12
    2.17UI bug修复
    beta阶段UI界面改进
    关于UI设计的心得体会-alpha和beta交界期间
    1.30进度
    2018.1.28进度更新
    心·迹 项目简介
    项目组成员介绍
  • 原文地址:https://www.cnblogs.com/weschen/p/8624071.html
Copyright © 2011-2022 走看看