react-express文件上傳

前臺使用superagent發送請求,后臺使用express的multer實現文件的上傳。

概述

  • 使用express的multer實現文件上傳
  • 使用superagent發送請求
  • FileReader對象實現圖片無刷新顯示

配置環境

npm install multer --save

項目的目錄結構

目錄結構

FileReader實現圖片的顯示

FileReader主要用于將文件內容讀入內存,通過一系列異步接口,可以在主線程中訪問本地文件。使用FileReader的readAsDataURL(file)的方法將文件的內容以data:url的字符串形式表示,在獲取文件內容成功后,使用onload方法將獲取的內容進行顯示。

//components/imageUpload.js
import React,{Component} from 'react';

class Image extends Component{

    isClick(){
        let  input=this.refs.file;
        let  img=this.refs.image;
        if(input.files&&input.files[0]){
            var fileObj=new FileReader();//實例化一個FileReader對象
            fileObj.onload=function(event){//屬性綁定方法
                img.src=event.target.result;

            };
            fileObj.readAsDataURL(input.files[0]);

        }
  }
render() {
        return (
            <div>
                <div>
                    <label className="location">照片:</label>
                    <input type="file" ref="file" className="fileStyle" onChange={this.isClick.bind(this)}/>//利用input的變化無刷新的顯示圖片
                </div>
                <div>
                    <img src="" className="imgType" ref="image"/>
                </div>
            </div>
        )
    }
}
export default ImageUploads;

superagent執行上傳

FormData會將數據格式化,再以POST方法上傳文件,使用react的ref屬性來獲取選擇的文件。

//components/imageUpload.js

import request from 'superagent';

handleClick(){
        let formData=new FormData();
        let  input=this.refs.file;
        let file=input.files[0]
        formData.append('avatar',file);
        request
            .post('/profile')
            .send(formData)
            .end((err,res)=>{
                console.log(res.body.filePath);
                this.props.uploadImage(res.body.filePath);  
            });
    }

express接受文件

//server.js
const express = require('express');
const path = require('path');
const multer = require('multer');  //引入express的multer模塊

//選擇diskStorage存儲
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, path.resolve('public/uploads'));
    },  // 保存的路徑,備注:需要自己創建
     filename: function (req, file, cb) {
        // 將保存文件名設置為  時間戳+字段名
        cb(null, Date.now() + path.extname(file.originalname));
    }
});

const upload = multer({storage: storage});

const app = express();

app.use(express.static('public'));  //將public文件夾下面的所有文件暴露出來

app.post('/profile', upload.single('avatar'), (req, res, next)=> {
    res.send({
        err: null,
        //filePath文件在項目中的保存路徑
        filePath: 'uploads/' + path.basename(req.file.path)
    });
}); 

詳細的代碼,請戳這里:項目地址,項目中還包含redux和mongodb將信息保存到數據庫中。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,335評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,941評論 18 139
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,241評論 4 61
  • 前兩部分我們已經完成了博客頁面的展示和后臺頁面的展示: React技術棧+Express+Mongodb實現個人博...
    SamDing閱讀 5,486評論 1 12
  • 鐵漢柔情 碼和49開723√ 碼和38開771√ 碼和16開856√ 碼和16開 鐵漢柔情斷組 304期 1267...
    鐵漢與柔情閱讀 174評論 0 1