文件上传本身其实并不复杂,但是它会牵涉到很多细节上的处理,加起来就比较复杂了。
主要用到的技术有:
dwr2
spring2.5
ibatis2
spring mvc
jquery
下面将分步进行说明:
1. 上传文件。
在spring 配置文件中声明上传文件的bean:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>1000000</value>
</property>
</bean>
在jsp页面中定义字段:
<input id="fileData" type="file" name="fileData"/>
JS验证扩展名:
var image =$("#fileData").val();
if(image!=''){
var checkimg = image.toLowerCase();
if (!checkimg.match(/(\.jpg|\.png|\.JPG|\.PNG|\.gif|\.GIF|\.jpeg|\.JPEG)$/)){
alert("请选择以下扩展名图片 .jpg,.png,.jpeg,.gif");
$("#fileData").focus();
return false;
}
在实体对象中定义MultipartFile属性:
private MultipartFile fileData;
public MultipartFile getFileData() {
return fileData;
}
public void setFileData(MultipartFile fileData) {
this.fileData = fileData;
}
在控制器中,可以使用命令对象的方式来绑定属性,但在2.5中使用了MultiActionController,所以绑定
对象直接使用bind()方法,如:
User user = new User();
super.bind(request, user);
MultipartFile fileData= user.getFileData();
byte[] data = fileData.getBytes();
一般会有一个文件名,即重新命名上传文件的文件名:
private String getFileName(MultipartFile fileData){
//上传的文件名
String uploadFileName = fileData.getOriginalFilename();
String extensionName = uploadFileName.split("\\.")[1];
UUID uuid = UUID.randomUUID();
return uuid.toString()+"."+extensionName;
}
上面采用了uuid的命名方式,这样至少要比用id来命名快一些,一般也不会出现重复。
2.ibatis中,在执行更新操作时,如果没有再次选择文件,则不要更新上传的文件字段。即在ibatis的update中:
<isNotEmpty property="staffIcon">
STAFF_ICON = #staffIcon:VARCHAR#,
</isNotEmpty>
3.在JSP页面中,通过dwr删除文件。
function removeStaffIcon(){
var staffId = $("#staffId").val();
staffService.deleteStaffIcon(staffId,function(data){
if(eval(data)){
alert("删除成功!");
$("#deleteStaffIcon").remove();
}else{
alert("删除失败! ");
}
});
}
<c:if test="${!empty staff.staffIcon}">
<div id="deleteStaffIcon">
<a href="<%=path%>/pages/basedata/dep/stafficon /${staff.staffIcon}">${staff.staffIcon}
</a>
<a onclick="removeStaffIcon();" href="javascript:void(0);">
<img border="0" alt="删除" src="<%=path%>/images/btn_delete.png">
</a>
</div>
</c:if>
4.在删除文件时,既要删除图片文件夹中的文件,也要将此字段的值设为空。在dwr中先获得
HttpServletRequest 即可知道文件存放路径。
WebContext context = WebContextFactory.get();
HttpServletRequest request = context.getHttpServletRequest();
String realPath = request.getSession().getServletContext().getRealPath("/");
。。。。