技术架构: Struts2 + JSP + jQuery
普通标签上传文件
页面标签
上传附件:
前端js
functionsavaData(labelId) {
//调用文件上传的JS方法var result =ajaxFileUpload(labelId, 30*1024*1024);if(result == 'false') {//返回false, 上传失败
return false;
}else{
alert(result.fileName);//原文件名
alert(result.fileNewName); //新文件名
alert(result.filePath); //上传到磁盘路径
return false;
}
}/**
* 上传文件
* labelId: 上传控件的Id
* fileSizeLimit: 上传大小限制(字节)*/
functionajaxFileUpload(labelId, fileSizeLimit) {//获取到文件对象
var file = $("#"+labelId)[0].files[0];
result= "false";if(null !=file) {var byteSize =file.size;if (byteSize >fileSizeLimit) {
alert("上传文件大小不能超过"+fileSizeLimit/1024/1024+"MB!");
return "false";
}var data = newFormData();
data.append("file", file);
data.append("filename", file.name);
$.ajax({
url :"uploadFile.action",
type :"POST",
async :false,
cache :false,
processData :false,//告诉jQuery不要去处理发送的数据
contentType : false,
data : data,
complete:function(XMLHttpRequest,textStatus){if(textStatus=='timeout'){var xmlhttp = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHttp");
xmlhttp.abort();
alert("网络超时");
return "false";
}
},
success :function(data) {if(data.isOk) {//data={"isOk":"true/false", "fileName":"原文件名", "fileNewName":"新文件名", "filePath":"上传到磁盘路径"}
result =data;
}else{
alert(data.info);
return "false";
}
},
error :function(err) {
fileUploadFalg= false;
alert(err);
return "false";
},
});
}returnresult;
}
后台Java代码
importorg.apache.commons.io.FileUtils;importorg.apache.commons.io.FilenameUtils;//用于返回json(setter/getter)
private Map validateExists = new HashMap();//文件上传(setter/getter)
privateFile file;privateString fileName;
@Action(value= "uploadFile", interceptorRefs ={
@InterceptorRef(value= "fileUpload", params={"maximumSize", "314572800"}),
@InterceptorRef(value= "basicStack")
},
results={
@Result(name= "success", type = "json", params= {"root","validateExists"}) })publicString uploadFile(){//通过config.properties配置一个文件存放路径, 如D:/upload/jrzx/
String filePath = FilePathUtil.FILE_ROOT + FilePathUtil.SEPARATOR + Config.getProperty("file.jrzx.logo") +FilePathUtil.SEPARATOR;try{
String storageFileName=generateFileName(fileName);if (null !=file) {if (314572800 < file.length()) { //大小不能超过300M
validateExists.put("isOk", false);
validateExists.put("info", "文件大小不能超过300M");
}else{
File path= new File(filePath +storageFileName);if(path.exists()) {
FileUtils.deleteQuietly(path);
}
FileUtils.moveFile(file, path);
validateExists.put("fileName", fileName);
validateExists.put("fileNewName", storageFileName);
validateExists.put("filePath",FilePathUtil.getVirtualPathBya( filePath +storageFileName));
validateExists.put("isOk", true);
validateExists.put("info", "上传成功");
}
}else{
validateExists.put("isOk", false);
validateExists.put("info", "请选择正确的文件格式和文件大小");
}
}catch(Exception e) {
e.printStackTrace();
StringWriter sw= newStringWriter();
PrintWriter pw= newPrintWriter(sw);
e.printStackTrace(pw);
log.error(sw.toString());
validateExists.put("isOk", false);
validateExists.put("info", "系统异常,请稍候重试!");
}returnSUCCESS;
}privateString generateFileName(String fileName) {
String newFileName= new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + (int)(Math.random()*9000+1000);
String prefix=FilenameUtils.getExtension(fileName);if (!Tool.isEmpty(prefix)) {
newFileName+= "." +prefix;
}returnnewFileName;
}
将上传控件修改为按钮(可以方便的修改样式)
下面这种方式应该也适合用"点击图片上传文件", 暂未尝试, 应该没问题
页面标签
上传附件:
${news.fileName}
未选择任何文件
}#uploadFile{position:absolute;left:0;top:0;opacity:0;
}
前端js
//当附件信息变更时的操作
function fileChange(defaultMsg) {
var uploadFilename = $("#uploadFile").val();
if(isEmpty(uploadFilename)) {
$("#uploadFileBtnText").html(defaultMsg);
$("#newsForm_news_fileName").val("")
}else {
var arr = uploadFilename.split("\\");
$("#uploadFileBtnText").html(arr[arr.length-1]);
$("#newsForm_news_fileName").val(arr[arr.length-1])
}
}
function deleteUploadFile(defaultMsg) {
if(isEmpty($("#newsForm_news_fileName").val())){
alert("不存在需要删除的附件!");
return false;
}
if(confirm("你确定删除附件吗?\n\n删除附件需要提交后才能生效!")){
$("#uploadFileBtnText").html(defaultMsg);
$("#newsForm_news_fileName").val("")
return false;
}
}
function saveNews(){
if(confirm("你确定提交吗?") && checkForm()){
var hasFile = $("#uploadFileBtnText").html();
var filePath = $("#newsForm_news_filePath").val();
var fileName = $("#newsForm_news_fileName").val();
var fileOldName = $("#newsForm_news_fileOldName").val();
//只要存在数据, 那就上传数据(因为即使文件名相同, 内容可能变更了), 然后后台再删除旧的数据
var result = "false"; var labelId = "uploadFile"; var fileSizeLimit = 999*1024*1024;
if( !isEmpty(fileName) && !isEmpty($("#"+labelId)[0].files[0])) {
result = ajaxFileUpload(labelId, fileSizeLimit); //上传文件
}else { //不存在数据, 不需要上传
result = {"filePath":"", "fileName":""};
}
//alert($("#uploadFileBtnText").html());
if(result != 'false') {//如果返回false
//alert("上传文件成功");
//alert(result.fileName); //原文件名
//alert(result.fileNewName); //新文件名
//alert(result.filePath); //上传到磁盘路径
//将当前的附件信息设置到隐藏域
$("#newsForm_news_filePath").val(result.filePath);
$("#newsForm_news_fileName").val(result.fileName);
//提交表单,保存数据
var rebutUrl = "saveNewsOfCs.action";
//$("#domains").val(getSelectTree("showDomains"))
$("#newsForm").attr("action", rebutUrl).submit();
return true;
}else {
return false;
}
}else{
return false;
}
}