本文介绍的是使用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");
});