实现图片上传并显示到浏览器功能

本文介绍的是使用node.js实现图片的上传并及时显示到浏览器的功能,希望可以帮得到大家,后台不用node.js,用其他的也行,思路是一样的。

首先介绍一下思路,然后再上代码

一、思路:

    大家都知道,<input type="file" name="imgUpload">,这个在浏览器显示的非常丑,所以我们可以通过点击其他的元素来触发<input type="file" name="imgUpload">的点击事件,实现漂亮的文件上传,当你选择好文件后,会触发<input type="file" name="imgUpload">,的change事件,在该事件中利用jquery插件jquery-form.js的ajaxSubmit函数来实现表单的异步提交,那就会有人问了,为什么并不直接用jquery的ajax函数异步提交呢,这个问的好,因为ajax不好传输文件数据,我在后台一直不能正确的获得使用ajax传递过来的数据。

   当前端可以正确的发送数据给后台之后,那么后台就要获取数据了,我使用的是node.js的formidable中间件,如果使用的是Java做后台的话,也有Java的一套获取文件数据的api。

二、代码:

upload.ejs

<html> 
 <head>
  <style>
   .uploadImgDiv{
     width:100px;
     height: 100px;
     border:1px solid #222;
     border-radius: 3px;
     overflow: hidden;
     cursor: pointer;  /*IMG的父元素的cursor是pointer*/
   }
   .uploadImgForm{
    display: none;
   }
   .uploadImg{
    width:100px;
    height: 100px;
   }
  </style>
  <script type="text/javascript" rel="stylesheet" src="jquery-1.12.2.js"></script>    //jquery-1.12.2.js这样的文件在当前文件所在目录的test目录下,静态文件有一个专门的存放目录
  <script type="text/javascript" rel="stylesheet" src="jquery-form.js"></script>
  <script type="text/javascript">
   var imgType={"jpg":1,"jpeg":1,"png":1}
  </script>
  <script type="text/javascript">
    $(function(){
       $("#uploadImg").click(function(){
           $(".uploadImgForm input[type=file]").trigger("click").change(function(){
              var str=$(this).val();
              var type=str.substr(str.lastIndexOf(".")+1);
              if(!imgType[type]){alert("请选择图片文件!");return;}  //判断选择的文件是不是图片格式的文件
               $("#uploadImg").attr("src","loading.gif").css({"width":100,"height":100});
                $.ajaxSetup({ cache: false });//这个不能少,否则ie下会提示下载 
               $(".uploadImgForm").ajaxSubmit({ 
                   url:"/upload",
                   method:"POST",
                   success:function(data,resText,jqXHR){
                        $("#uploadImg").attr("src",data.src).css({"width":100,"height":100});  //用来自服务端的数据修改图片的src
                   }
               });
           });
       });
    });
  </script>
 </head>      
 <body> 
  <div class="uploadImgDiv">
   <img id="uploadImg" src="2.png">
  </div>
  <form class="uploadImgForm" method="post" enctype="multipart/form-data">
   <input type="file" name="imgFile">
  </form>
 </body>
</html>


fileUpload.js

var express=require("express");
var bodyParser=require("body-parser");
var formidable=require("formidable");
var util=require("util");
var fs=require("fs");


var app=express();
app.set("views",__dirname);
app.set("view engine","ejs")  //设置模版引擎是ejs
app.use(bodyParser.urlencoded({extended:false}));  //body-parser可以用来解析form提交过来的数据,和contentType=application/x-www-form-urlencoded类型的数据
app.use(bodyParser.json());    //用来解析ajax的contentType="application/json"类型的数据
app.use(express.static(__dirname+"/test"));   //设置静态文件的存放路径,前面upload.ejs中的很多静态文件都在个目录
app.get("/upload",function(req,res){
    res.render("upload");
});
app.post("/upload",function(req,res){
    var form=new formidable.IncomingForm();    
    form.uploadDir=__dirname+"/test";      //设置客户端上传来的文件的存放路径
    form.keepExtensions=true;                     //是否保留文件的后缀
    form.parse(req,function(err,fields,files){  //form.parse是解析文件函数,当它执行完成,文件就已经存在form.
    console.log(util.inspect(files));     //files存储着上传过来的文件对象信息
    console.log(util.inspect(fields));  //fields是除file之外的其他的表单数据,
        var newName=files.imgFile.path.replace(files.imgFile.path.substr(files.imgFile.path.lastIndexOf("\\")+1),files.imgFile.name);

        //file.imgFile.path表示上传文件在服务器的存放路径,包括文件名,files.imgFile.name是文件的真实名称
        console.log(newName);
        fs.rename(files.imgFile.path,newName,function(){   //重命名上传来的文件
            res.write({src:files.imgFile.name});   //返回刚刚上传文件的文件名,当ajaxSubmit获取到后,这个文件名会被设置成一个img的src,从而加载这张图片
        });
   
    });
});
app.listen(1337,"127.0.0.1",function(){
console.log("server is listenning on 127.0.0.1:1337");
});

你可能感兴趣的:(form,node.js,ajaxSubmit,图片上传,formidable)