2017-05-10 595 views
0

我需要將圖片上傳到網站,並在上傳後將其顯示在網頁上,並顯示文件名的標題在形象下。我搜索了很多關於上傳和顯示在同一頁面上的很多教程,但我認爲我只理解了從服務器請求信息並將其顯示回來的內容。上傳圖片並在頁面上顯示該圖片(Node.js,React,js,Express.js)

我正在編寫我的web應用程序在node + react中,並使用express和multer作爲文件IO。這裏是我的代碼:

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import Dropzone from 'react-dropzone-component'; 
import fs from 'fs'; 
import express from 'express'; 
import mutler from 'mutler'; 

var app = express(); 
var storage; 
var upload; 

export default class Form extends React.Component { 
constructor (props) { 
    super(props); 
    storage = multer.diskStorage({ 
     //file destination 
     destination: function (req, file, callback) { 
      callback(null, '/uploads/'); 
     }, 
     //set the filename 
     filename: function (req, file, callback) { 
      callback(null, file.originalname); 
      this.state = { 
       name: file.originalname 
      }; 
     } 
    }); 
    upload = multer({ storage : storage}).single('userImage'); 
    app.use('/uploads/', express.static(__dirname + '/uploads/')); 
} 

handleImageUpload() { 
    app.post('/', function (req, res) { 
     fs.readFile(req.files.userImage.path, function(err, data) { 
      console.log('error with ' + data); 
     }); 
     upload(req, res, function (err) { 
      if (err) { 
       return res.end("Error uploading file."); 
      } 

      res.writeFile("/uploads/" + origName, new Buffer(req.body.photo, "base64"), function(err) { 
       console.log("error writing image"); 
      }); 
      res.redirect('/'); 
     }); 
    }); 
} 

getName() { 
    return this.state.name; 
} 

render() { 
    return (<div> 
     <form action="/" method="post" enctype="multipart/form-data"> 
      <input type="image" name="userImage"/> 
      <input type="submit" name="submit" value="submit" onClick={this.handleImageUpload.bind(this)}/> 
     </form> 
    </div> 

    ); 
} 

} 

我試過以下多個教程(這就是爲什麼懸浮窗是進口的),但我實在不明白這一點的是我想做的事情。

我想如果我在構造函數中將文件名保存爲狀態,那麼我可以稍後獲取它並將其顯示在另一個文件中,該文件只是將文件的url歸屬到較高的反應文件中的圖像源。

我的問題是:我哪裏出錯了?按照我的理由,這應該可以工作,但我是新來的IO節點,並且我看過的教程中的許多人似乎都是常識,並不是單擊我。預先感謝您的幫助!

回答

1

使用以下模塊選擇圖像。
https://www.npmjs.com/package/react-image-uploader

然後,您可以使用xhr請求將圖像上傳到服務器。以下是示例代碼。

var xhr = new XMLHttpRequest(); 
xhr.onload = function (e) { 
//your success code goes here 
} 
var formData = new FormData(); 
xhr.open("POST", url, true); 
formData.append('file', fileData); 
xhr.send(formData); 

我假設你正在實施下列要求。

  1. 允許用戶選擇圖像。
  2. 上傳所選圖像
  3. 將所選圖像顯示給用戶。

什麼我的解決方案將幫助

  1. 允許用戶選擇圖像,他/她選擇什麼
  2. 顯示用戶。
  3. 通過可用回調將圖像上傳到服務器(教程中提到)
  4. 顯示成功或失敗。

如果您需要任何幫助,請告訴我。 :)

+0

非常感謝!這確實有幫助,並使整個過程更簡單。我在這裏看到,你已經對成功代碼發表了評論,那會是一個怎樣的例子?我可以告訴你在代碼中進一步發佈POST,現在我已經將「成功」這個詞打印到控制檯,作爲我在代碼中的指示器。 再一次,我很抱歉,如果這是另一個真正愚蠢的問題,但如何在沒有采取行動的情況下發佈網址?我認爲這是最終對我沒有意義的。 – DottoraQN

+0

成功代碼示例? 我使用的是流量架構。它可以幫助我廣播我已經成功發佈圖像,以便更新我的反應組件狀態。 post url如何在沒有任何操作的情況下工作? 沒有得到你的問題,請嘗試更多地解釋它。 有沒有這樣的事情作爲一個愚蠢的問題:) – user3770494

+0

從我的理解POST是如何工作的,url需要與html表單上的操作相同。我試圖將我的網址設置爲'/',因爲我不想在任何地方重定向,並冒着搞砸圖像顯示的風險,但該網站不喜歡它。我錯過了什麼? – DottoraQN