java文件上传
技术架构: Struts2 + JSP + jQuery
普通标签上传文件
页面标签
<tr> <td class="table_a_td_l">上传附件:</td> <td colspan="2" class="table_a_td_r"> <input name="uploadFile" id="uploadFile" type="file" style="width:170px;" onchange="return saveData('uploadFile')" > </td> </tr>
前端js
function savaData(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: 上传大小限制(字节) */ function ajaxFileUpload(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 = new FormData(); 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"; }, }); } return result; }
后台Java代码
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; //用于返回json(setter/getter) private Map<String,Object> validateExists = new HashMap<String, Object>(); //文件上传(setter/getter) private File file; private String fileName; @Action(value = "uploadFile", interceptorRefs = { @InterceptorRef(value = "fileUpload", params={"maximumSize", "314572800"}), @InterceptorRef(value = "basicStack") }, results = { @Result(name = "success", type = "json", params= {"root","validateExists"}) }) public String 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 = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); log.error(sw.toString()); validateExists.put("isOk", false); validateExists.put("info", "系统异常,请稍候重试!"); } return SUCCESS; } private String 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; } return newFileName; }
将上传控件修改为按钮(可以方便的修改样式)
下面这种方式应该也适合用"点击图片上传文件", 暂未尝试, 应该没问题
页面标签
<td class="table_a_td_l">上传附件:</td> <!-- <td colspan="2" class="table_a_td_r"> <input name="uploadFile" id="uploadFile" type="file"> onchange="return savaData('attributeId', 'uploadFile', 999*1024*1024)" </td> --> <s:hidden name="news.filePath" ></s:hidden> <s:hidden name="news.fileOldPath" ></s:hidden> <s:hidden name="news.fileName" ></s:hidden> <s:hidden name="news.fileOldName" ></s:hidden> <td colspan="1" class="table_a_td_r"> <label for="fileinp"> <input type="button" value="选择文件"> <s:if test="news.fileName != null"><span id="uploadFileBtnText">${news.fileName}</span></s:if> <s:else><span id="uploadFileBtnText">未选择任何文件</span></s:else> <input name="uploadFile" id="uploadFile" type="file" onchange="return fileChange('未选择任何文件')"> </label> <label> <input type="button" value="删除" onclick="deleteUploadFile('未选择任何文件')"> <!-- <img src="${basePath}/images/sc.gif" alt="删除"width="37" height="19" border="0" /> --> </label> </td> <style> label{ position: relative; } #uploadFile{ position: absolute; left: 0; top: 0; opacity: 0; } </style>
前端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;
}
}