webuploader api 文档 http://fex.baidu.com/webuploader/doc/
在我们的项目中添加上传图片功能
原始页面如下
我们在原有的jsp上加上下面代码
(1)引入百度上传js css
<link rel="stylesheet" type="text/css"
href="<%=basePath%>/plug-in/webuploader/js/webuploader.css">
<script type="text/javascript"
src="<%=basePath%>/plug-in/webuploader/js/webuploader.js"></script>
(2)调用百度上传组件
<script>
var $ = jQuery, $list = $('#thelist'), state = 'pending', uploader;
jQuery(function() {
//判断是否是新增 若新增 这个id为空 若不是新增那么该人已经在系统存在 表示这个人已经上传过签名了 就显示他以前的签名照片
var s=$("#id").val();
if(s==null||s==""||s==undefined){
}else{
$("#filelists").removeAttr("style");
}
uploader = WebUploader.create({
// swf文件路径
swf : '${webRoot}/plug-in/webuploader/js/Uploader.swf',
// 文件接收服务端。
server : 'uploadDataController.do?uploadQMPic',
// 不压缩image
resize : false,
//weifasle手动上传 true 选择就上传
auto:false,
//是否允许在文件传输时提前把下一个文件准备好。 对于一个文件的准备工作比较耗时,比如图片压缩,md5序列化。 如果能提前在当前文件传输期处理,可以节省总体耗时
prepareNextFile:false,
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick : '#picker',
//是否要分片处理大文件上传。
chunked : false,
//多大分片chunkSize : 1014 * 1024,
//并发上传
threads : true,
// formData {Object} [可选] [默认值:{}]文件上传请求的参数表,每次发送都会发送此对象中的参数。
//验证文件总数量, 超出则不允许加入队列。
fileNumLimit : 10,
//验证单个文件大小是否超出限制, 超出则不允许加入队列。
fileSingleSizeLimit : 1000 * 1024 * 1024,
//去重 根据文件名字、文件大小和最后修改时间来生成hash Key.
duplicate : true,
//指定接受哪些类型的文件。 由于目前还有ext转mimeType表,所以这里需要分开指定。
accept: { title: 'Images', extensions: 'gif,jpg,jpeg,bmp,png', mimeTypes: 'image/*' } ,
thumb:{
width: 77,
height: 29,
// 图片质量,只有type为`image/jpeg`的时候才有效。
quality: 70,
// 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
allowMagnify:false,
// 是否允许裁剪。
crop: true,
// 为空的话则保留原有图片格式。
// 否则强制转换成指定的类型。
type: 'image/jpeg'
}
});
// 当有文件添加进来的时候
uploader.on('fileQueued', function(file) {
var card = $("#idcard").val();
//alert(card);
if(card==null||card==""||card==undefined) {
$("#isfzjy").html("请先填写身份证号码");
$("#isfzjy").css("color","red");
$("#idcard").focus;
return false;
}
document.getElementById("picker").style.display='none';
document.getElementById("quxiao").style.display='block';
//删除原有的div
$("#pic").attr("style","display:none");
var $li = $( '<div id="' + file.id + '" class="file-item thumbnail">' + '<img>' + '<div class="info">' + file.name + '</div>' + '</div>' ), $img = $li.find('img');
// $list为容器jQuery实例
$("#thelist").append( $li );
// 创建缩略图 // 如果为非图片文件,可以不用调用此方法。 // thumbnailWidth x thumbnailHeight 为 100 x 100
uploader.makeThumb( file, function( error, src ) {
if ( error ) { $img.replaceWith('<span>不能预览</span>');
return;
}
//设置刚刚选着的照片的大小
$img.attr( 'src', src ); }, 77, 29 );
//alert($li);
//$("#picker").css("display","none");
//上传文件列表显示
// $("#filelists").css("display","block");
$("#filelists").removeAttr("style");
//$("#fileurl").removeAttr("style");
uploader.options.formData.picName = card;
uploader.upload();
});
// 文件上传过程中创建进度条实时显示。
uploader.on(
'uploadProgress',
function(file, percentage) {
var $li = $('#' + file.id), $percent = $li.find('.progress .progress-bar');
// 避免重复创建
if (!$percent.length) {
$percent = $(
'<div class="progress progress-striped active">'
+ '<div class="progress-bar" role="progressbar" style="width: 0%">'
+ '</div>' + '</div>')
.appendTo($li)
.find('.progress-bar');
}
$li.find('p.state').text('上传中');
$("#progress_span").html((percentage*100).toFixed(2)+'%');
//$percent.css('width', percentage * 100 + '%');
});
uploader.on('uploadSuccess', function(file, response) {
if(0==response.success){
//alert(1);
$('#' + file.id).find('p.state').text('已上传');
setFileInfo(response.obj);
}else{
$('#' + file.id).find('p.state').text('上传失败!');
}
});
uploader.on('uploadError', function(file, reason) {
//$('#' + file.id).find('p.state').text('上传出错');
swal('上传出错!');
document.location.reload();//当前页面
});
uploader.on('uploadComplete', function(file) {
$('#' + file.id).find('.progress').fadeOut();
});
uploader.on('all', function(type) {
if (type === 'startUpload') {
state = 'uploading';
} else if (type === 'stopUpload') {
state = 'paused';
} else if (type === 'uploadFinished') {
state = 'done';
}
});
uploader.upload();
});
//上传成功回调 吧上传的图片地址 写到我们的jsp上,表单提交时候取这个div的值保存到表中
function setFileInfo(data){
//alert(data.filePath);
$("#picurl").val(data.filePath);
}
//点击取消 时候 把刚刚上传的文件删掉
function quxiao(){
document.getElementById("picker").style.display='block';
document.getElementById("quxiao").style.display='none';
var s=$("#id").val();
if(s==null||s==""||s==undefined){
//新建病人
$("#filelists").attr("style","display:none");
//获取刚刚上传的照片的绝对路径
var picurl=$("#picurl").val();
var bz=1;//新建病人时候删出身份证图片
$("#thelist").empty();
//ajax 请求后台 删除上传文件
$.ajax({
type: "POST",
url: "uploadDataController.do?delIdcardPic",
dataType: "json",
data: { url: picurl,bz: bz},
success: function (data) {
//删出成功 把picurl值删出
$("#picurl").val("");
}
});
}else{
//修改病人
//原图片显示
$("#pic").removeAttr("style");
//新增图片隐藏
$("#thelist").empty();
var bz=2;
var picurl=$("#picurl").val();
$.ajax({
type: "POST",
url: "uploadDataController.do?delIdcardPic",
dataType: "json",
data: { url: picurl,bz: bz},
success: function (data) {
//删出成功 把picurl值删出
//$("#picurl").val("");
}
});
}
}
</script>
jsp 添加代码
<td align="right" height="60px"><label class="Validform_label"> <t:mutiLang langKey="签名照片"/>: </label></td>
<td class="value" >
<div id ="picker">选择文件</div>
<div id ="quxiao" οnclick="quxiao()" style="width:83px;height:34px; background-color:#00b7ee; border-radius:3px; color:#ffffff; text-align:center; padding-top:10px; display:none;">取消选择</div>
</td>
</tr>
<tr id="filelists" style="display:none">
<td align="right" ><label class="Validform_label"> <t:mutiLang langKey="签名照片浏览"/>: </label></td>
<td class="value">
<div id="thelist" class="uploader-list"> </div>
<!--用来存放我们图片的 ,当不是新增,是编辑时候,要显示图片-->
</td>
</tr>
<tr id="fileurl" style="display:none" >
<td align="right" ><label class="Validform_label"> <t:mutiLang langKey="签名照片路径"/>: </label> </td>
<td class="value">
<!--用来存放图片路径 -->
<div>
<input id="picurl" class="inputxt" name="picurl" value="${user.signatureFile}"/>
</div>
</td>
</tr>
在form表单提交时候
//判断是不是真增
var s=$("#id").val();
var bz=3;
var picurl=$("#picurl").val();
if(s!=null&&s!=""&&s!=undefined){
//删除身份证文件夹中back的
$.ajax({
type: "POST",
url: "uploadDataController.do?delIdcardPic",
dataType: "json",
data: { url: picurl,bz: bz},
success: function (data) {
}
});
};
java代码
@SuppressWarnings("unchecked")
@RequestMapping(params = "uploadQMPic", method = { RequestMethod.POST,RequestMethod.GET })
public void uploadQMPic(@RequestParam(value = "file", required = false) MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {
File targetFile = null;
String msg = null;
int code = 0;
try {
//找到文件存储路径 ,根据实际情况定义
String realPath = FileGenerater.getPathUpload("qianming_pic");
if(request.getParameter("chunk") == null) {
String fileName = System.currentTimeMillis()+"_"+file.getOriginalFilename();//存在硬盘上的文件名
if(fileName.length()>32){//修改文防止名字过长
fileName = fileName.substring(0,fileName.length());
}
targetFile = new File(realPath, fileName);//存在
file.transferTo(targetFile); // 小文件,直接拷贝
}else{
int chunk = Integer.parseInt(request.getParameter("chunk")); // 当前分片
int chunks = Integer.parseInt(request.getParameter("chunks")); // 分片总计
String Ogfilename = file.getOriginalFilename();
targetFile = new File(realPath, Ogfilename);
OutputStream outputStream = new FileOutputStream(targetFile, true);
InputStream inputStream = file.getInputStream();
byte buffer[] = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
inputStream.close();
outputStream.close();
}
if(FileCheckUtil.isDanger(targetFile)){
throw new Exception("非法文件!");
}
//操作成功
Map map = new HashMap();
code = 0;
msg = "success!";
map.put("filePath", targetFile.getAbsolutePath());
map.put("fileName", targetFile.getName());
map.put("fileLength", targetFile.length());
ResponseUtil.flushJson(response, new JsonRe(code,msg, map));
}catch(Exception e){
//操作失败
e.printStackTrace();
msg = e.getMessage();
ResponseUtil.flushJson(response, new JsonRe(1,msg, null));
}
}
/**
* 删除上传的图片
* @param request
* @param response
* @throws Exception
*/
@SuppressWarnings("unchecked")
@RequestMapping(params = "delIdcardPic", method = { RequestMethod.POST,RequestMethod.GET })
public void delIdcardPic(HttpServletRequest request, HttpServletResponse response) throws Exception {
String url=request.getParameter("url");
String bz=request.getParameter("bz");
if(bz.equals("1")){
if(url!=null){
File f= new File(url);
if(f.exists()){
f.delete();
}
}
}else if(bz.equals("2")){
if(url!=null){
File f= new File(url);
if(f.exists()){
f.delete();
//String newurl=url.substring(0,url.indexOf("_back"));
String newurl=url+"_back";
System.out.println(newurl);
File newf= new File(newurl);
if(newf.exists()){
newf.renameTo(new File(url));
}
}
}
}else{
if(url!=null){
url=url+"_back";
File f=new File(url);
if(f.exists()){
f.delete();
}
}
}
}
上面保存完上传的图片,并且把路径保存到相应的表中了,现在我们就要实现编辑用户时候,这个图要显示出来在上面的jsp代码里,
<div id="pic"><img src="data:image/png;base64,${imgPath}" width="77" height="29" /></div>
我实现的思路是 ,通过表里保存的路径 ,拿到2进制数据,转base64,传到前台。
java代码
if(user.getSignatureFile()!=null&&!user.getSignatureFile().equals("")){
File f = new File(user.getSignatureFile());
FileInputStream input;
try {
input = new FileInputStream(f);
byte[] buffer = new byte[(int) f.length()];
input.read(buffer);
input.close();
//System.out.println(Base64.byteArrayToBase64(buffer));
req.setAttribute("imgPath", Base64.byteArrayToBase64(buffer));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}