2017-05-10 549 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