本次开发采用uploader插件 需要在前台引入 使用该插件的 Uploader.swf文件(用于使用时js指向)
在wingsUploader.js 中对uploader插件进行设置
(function($) { //
// 设置属性
var uploader;
var ratio = window.devicePixelRatio || 1; //用于缩略图
// var thumbnailWidth = 50 * ratio; //缩略图的宽
// var thumbnailHeight = 50 * ratio; //缩略图的高
/**
* 构造函数
*/
$.fn.wingsUploader = function(options) {
// 设置组件参数
var opts = $.extend({}, $.fn.wingsUploader.defaults, options);
opts.pick = "#" + this[0].id;
successFun = opts.successfun;
errorFun = opts.errorFun;
// 初始化Web Uploader
uploader = WebUploader.create(opts);
// 创建文件显示位置
// 当有文件被添加进队列的时候
this.pictureShow = function(id){
uploader
.on(
'fileQueued',
function(file) {
var $li = $(
'<div id="' + file.id + '" class="file-item thumbnail">' +
'<img>' +
// '<div class="info">' + file.name
// + '</div>' +
'</div>'
),
$img = $li.find('img');//创建缩略图
// $list为容器jQuery实例
$(id).html( $li );
/* if(closeUploader()){ */
// 创建缩略图
// 如果为非图片文件,可以不用调用此方法。
// thumbnailWidth x thumbnailHeight 为 100 x 100
closeUploader(uploader);
uploader.makeThumb( file, function( error, src ) {
if ( error ) {
$img.replaceWith('<span>不能预览</span>');
return;
}
$img.attr( 'src', src );
// }, thumbnailWidth, thumbnailHeight );
});
});}
// 删除文件
/*
* $(id).on("click", ".stateweq", function() { var $ele = $(this);
* var id = $ele.closest("div").find(".hdid").text(); var file =
* uploader.getFile(id); uploader.removeFile(file); $('#' +
* file.id).remove(); });
*/
uploader.on("error", function(type){ //设置文件上传大小不能超过默认值
if(type == "Q_TYPE_DENIED"){
dialogMsg( "myModal", "messageP", "请上传JPG,PNG格式文件");
} else if(type == "F_EXCEED_SIZE"){
dialogMsg("myModal","messageP","文件大小不能超过8M");
}
})
// 文件上传过程中创建进度条实时显示。
/*
* 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('上传中');
*
* $percent.css('width', percentage * 100 + '%'); });
*/
// 文件上传失败会派送uploadError事件,成功则派送uploadSuccess事件。不管成功或者失败,在文件上传完后都会触发uploadComplete事件。
uploader.on('uploadSuccess', function(file) { // 成功后刷新页面
$('#' + file.id).find('span.state').text('已上传');
$('#' + file.id).find('.stateweq').remove();
window.location.reload();
});
uploader.on('uploadError', function(file) { // 失败后刷新页面
$('#' + file.id).find('span.state').text('上传出错');
WingsDialog.alert("提示","logo信息保存失败 请重新操作!",{
onhidden:function(){
window.location.reload();
}
});
});
/*
* uploader.on('error', function(handler) { if (handler ==
* "Q_EXCEED_NUM_LIMIT") { alert("只能上传一张图片"); } });
*/
uploader.on('uploadComplete', function(file) {
$('#' + file.id).find('.progress').fadeOut();
});
/*如果上传图片同时 带参数*/
/*uploader.on('uploadBeforeSend', function(block, data) {
var proName = $("#proName").val();
if(proName==""){
proName="defaultName";
}
block.file.name= proName; // 将存在file对象中的md5数据携带发送过去。
}, 2);*/
/* }; */
// 完成上传完了,成功或者失败,先删除进度条。
uploader.on('uploadComplete', function(file) {
$('#' + file.id).find('.progress').remove();
});
/*
* // 创建图片显示位置 this.pictureShow = function(id) {
* }
*/
/**/
// 文件上传开始事件
this.fileStart = function() {
uploader.upload();
}
//清空文件列表 例如重置按钮可调用此方法 不能用页面元素清空的方法因为清空后无法下次选择图片
this.reset=function(){
uploader.reset();
}
return this;
};
// 默认设置
$.fn.wingsUploader.defaults = {
swf : '/gxyt/gxyt008/need/Uploader.swf', //指向Uploader.swf
server : '', // 文件接收的服务端
pick : '', // 展示文件的id
auto : true, // 选完文件后是否自动上传
resize : false, // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
}; })(window.jQuery);
function selectFile(file) {
var html = '', i = 0; $("#preview").html('<div class="upload_loading"></div>');
var funAppendImage = function() {
if (file) {
var reader = new FileReader() reader.onload = function(e) {
html = html + '<div id="uploadList_' + i + '" class="upload_append_list"><p><strong>' + file.name + '</strong>' + '<a href="javascript:" class="upload_delete" title="删除" data-index="' + i + '">删除</a><br />' + '<img id="uploadImage_' + i + '" src="' + e.target.result + '" class="upload_image" /></p>' + '<span id="uploadProgress_' + i + '" class="upload_progress"></span>' + '</div>';
i++;
funAppendImage();
}
reader.readAsDataURL(file); } else {
$("#preview").html(html); if (html) { // 删除方法 $(".upload_delete").click( function() { FILE.funDeleteFile(files[parseInt($(this).attr( "data-index"))]); return false; });
// 提交按钮显示 $("#fileSubmit").show(); } else { // 提交按钮隐藏 $("#fileSubmit").hide(); } } }; funAppendImage(); } /* 关闭上传框窗口后恢复上传框初始状态 */
function closeUploader(uploader) {
// 移除所有缩略图并将上传文件移出上传序列
for (var i = 0; i < uploader.getFiles().length-1; i++) {
// 将图片从上传序列移除
uploader.removeFile(uploader.getFiles()[i]);
// uploader.removeFile(uploader.getFiles()[i], true);
// delete uploader.getFiles()[i]; // 将图片从缩略图容器移除
/* * var $li = $('#' + uploader.getFiles()[i].id); *
$li.off().remove(); */ return uploader.getFiles().length;
}
/* * setState('pedding'); */
// 重置文件总个数和总大小 /* * fileCount = 0; fileSize = 0; * // 重置uploader,目前只重置了文件队列 uploader.reset(); * // 更新状态等,重新计算文件总个数和总大小 updateStatus(); */ } // 创建上传的文件
怎样传文件的同时,传递参数 可uploader.on('uploadBeforeSend', function(block, data) { var proName = $("#proName").val();
if(proName==""){ proName="defaultName"; } block.file.name= proName; // 将存在file对象中的md5数据携带发送过去。 }, 2);该方法在文件发送前触发 可携带参数 这里是要传递logo图片的同时,传递产品名称由于后台的接受限制又不需要获取文件名 所以把产品名作为文件名传递但要注意的是 如果 文件命令为aa.jpg proName是 bb 那么通过此方法将获得proName的值为bb 但是如果proName为空值 那么将默认传递文件名 后台获得的proName的值将为aa
后台可用 final String proName = (String) list.get(0).getName();进行接收
当要注意 该方法只有触发了uploader插件才执行 所以对于只进行名称修改 而不做图片修改来说并不适用 本次是把文件名称抽出来单独进行保存 与文件保存分开。
function initSuccess(res) {// 初始化用// 初始化wingsUploader //picker 用于图片上传
var uploader = $('#picker')
.wingsUploader(
{
server : "/ajax.sword?ctrl=GxytGnzjImageCtrl_saveImageData,
auto : false,
pick : {
id : "$('#picker')",
multiple : false
},
fileSingleSizeLimit : 8 * 1024 * 1024,// 设定单个文件大小
// fileNumLimit:1,
// 只允许选择图片文件
accept : {
title : 'Images',
extensions : 'gif,jpg,jpeg,bmp,png,svg',
mimeTypes : 'image/gif,image/jpeg,image/jpg,image/png,image/svg,image/bmp'
},
thumb : {
// width: 110,
// height: 110,
// 图片质量,只有type为`image/jpeg`的时候才有效。
quality : 70,
// 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
allowMagnify : true,
// 是否允许裁剪。
crop : false
// 为空的话则保留原有图片格式。
// 否则强制转换成指定的类型。
// type: 'image/jpeg'
},
successfun : function() {
},
errorFun : function() {
}
});
uploader.pictureShow("#preview");
var $btn = $('#ctlBtn');
var $delbtn = $('#delBtn');
$btn.click(function() { $btn 保存按钮
uploader.fileStart();//上传文件
saveProName();//点击保存时 调用的其它方法
savaXuan();//点击保存时 调用的其它方法
});
}
jsp
<div id="list" class="uploader-list"></div>
<div class="btns">
<div style="margin-top: -10px;">
<div class="weui_uploader_input_wrp">
<div class="weui_uploader_input" id="picker"></div> //插件将自动生成input
</div>
</div>
<div class="form-group" style="overflow: hidden;">
<div id="uploader" class="wu-example" style="">
<form id="uploadForm" action="upload.php" method="post"
enctype="multipart/form-data">
<div class="upload_box">
<div class="upload_main" style="background:#fff;">
<div id="preview" class="upload_drag_area" style=""></div>//用于图片预览
</div>
</div>
</form>
</div>
</div>
java Ctrl:
@SuppressWarnings("unchecked")
public IResData saveImageData(IReqData req) throws SwordBaseCheckedException, FileUploadException, IOException {
final IResData res = new SwordRes();
final List<FileItem> list = req.getUploadList();//得到文件这里默认使用list<FileItem> 来接收//final String proName = (String) list.get(0).getName();
final FileItem filetem = list.get(0);//创建文件filetem对象 用于后续获取文件大小 类型等
final InputStream stream = filetem.getInputStream();// 以流的形式返回上传文件的主体内容 建立一个连接到所传图片的位置的流 并将数据源中的数据转换为流对象
// 获取文件相关的信息
final byte[] bytes = IOUtils.toByteArray(stream);// 进文件inputStream流转化为byte[]数组 用于读取写文件
final Long fileSize = filetem.getSize();// 文件大小
final String fileLx = filetem.getContentType();// 文件类型
//final String fileName = filetem.getName();// 文件名称
final HttpServletRequest request = ContextAPI.getReq();//HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,
//HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息
final String path = request.getSession().getServletContext().getRealPath("/gxyt/logo");//获得服务器相对于/gxyt/logo的地址
final File filepackpath = new File(path); //以该地址创建一个文件
if (filepackpath.exists()) {// 如果该文件夹存在 删除文件夹里所有的文件
deleteAll(filepackpath);
//filepackpath.delete();
} else { //如果文件夹不存在 创建文件夹
filepackpath.mkdirs();// 新建
}
final Map<String, Object> fileMap = new HashMap<String, Object>();
fileMap.put("filePath", File.separator + "gxyt" + File.separator + "logo" + File.separator);
fileMap.put("fileSize", fileSize);
fileMap.put("fileLx", fileLx);
//fileMap.put("proName", proName);
/* final Map<String, Object> filemap = (Map<String, Object>) SwordServiceUtils.callService("SWZJ.DSJYPT.GXYT010.SAVEIMAGEDATA", fileMap);
final String tempFilePath = (String) filemap.get("filePath");//得到文件位置(Map<String, Object>)
if (filemap.get("flag").equals(1)) {//文件路径保存成功 flag=1 图片写入服务器
final File filepath = new File(tempFilePath);
final OutputStream bos = new FileOutputStream(filepath);
while ((bytesRead = stream.read(file, 0, file.length)) != -1) {
bos.write(file, 0, bytesRead);// 将文件写入服务器
}
bos.close();
stream.close();
}*/
int bytesRead = 0; //stream,read();方法每次返回的都是int类型
while ((bytesRead = stream.read(bytes, 0, bytes.length)) != -1) {//读文件个数
final Map<String, Object> filemap = (Map<String, Object>) SwordServiceUtils.callService("SWZJ.DSJYPT.GXYT010.SAVEIMAGEDATA", fileMap);//请求一次路径
//final String tempFilePath = (String) filemap.get("filePath");//得到文件位置(Map<String, Object>)
final String tempFilePath = filepackpath + File.separator + "logo." + fileLx.substring(fileLx.lastIndexOf("/") + 1);//得到文件路径(带有文件的)
if (filemap.get("flag").equals(1)) {//文件路径保存成功 flag=1 图片写入服务器
final File filepath = new File(tempFilePath);//以这个路径创建文件
final OutputStream bos = new FileOutputStream(filepath);//创建这个路径下的输出流
bos.write(bytes, 0, bytesRead);// 进bytes数组从第一个0 到字节存在的位置 写到bos输出流里
bos.close();//关闭输出流
//图片进行压缩 采用下面方法 由于本图片文件为logo 所以不进行图片压缩
//ImageZipUtil.zipWidthHeightImageFile(new File(tempFilePath), new File(tempFilePath), 28, 28, 1.0f);//文件写入服务器之后把图片压缩为28*28 再上传
}
}
stream.close();
return res;
}
//删除文件夹里所有的文件
public static void deleteAll(File file) {
if (file.isFile() || file.list().length == 0) { //传过来的参数是文件 或是 file.list().length == 0是文档等其他的 把该文件或或者文档删除
list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组
file.delete();
} else { //如果文件夹下有文件 上一步操作将失败 执行else语句
final File[] files = file.listFiles(); //对文件夹的文件进行遍历
for (int i = 0; i < files.length; i++) {
deleteAll(files[i]); //递归 防止文件夹下还有 有文件的文件夹
files[i].delete(); //删除所有文件
}
}
}