文件上传的要素
- 表单提交方式必须是POST
- 表单的enctype属性:必须设置为multipart/form-data
- 表单必须有文件上传项:file
表单
<form id=form1 name=form1 action="${pageContext.request.contextPath }/image_save.action" method=post enctype="multipart/form-data">
<input type="file" name="upload">
<input class=button id=sButton2 type=submit value="保存" name=sButton2>
<form>
上传中会出现的问题和解办法
- 如果文件重名发生覆盖问题
- 同目录下文件/目录过多,性能问题
- 在images下最多创建16个目录,任意一个目录进入之后最多创建16个目录,最多创建8层目录
-
编写工具类
public class UploadUtils {
public static String getUuidFileName(String filename){
int idx = filename.lastIndexOf(".");
String entions = filename.substring(idx);
String ufilename = UUID.randomUUID().toString().replace("-", "")+entions;
return ufilename;
}
public static String getPath(String uuidFilename){
int code1 = uuidFilename.hashCode();
int d1 = code1 & 0xf;
int code2 = code1 >>> 4;
int d2 = code2 & 0xf;
return "/"+d1+"/"+d2;
}
}
imageAction.class的编写
public class imageAction{
public void image_save(){
if(upload != null){
String path ="C:/upload";
String uuidFilename =UploadUtils.getUuidFileName(uploadFileName);
String realPath = UploadUtils.getPath(uuidFilename);
String url = path+realPath;
File file = new File(url);
if(!file.exists()){
file.mkdirs();
}
File dictFile = new File(url+"/"+uuidFilename);
FileUtils.copyFile(upload, dictFile);
customer.setCust_image(url+"/"+uuidFilename);
}
}
}
在struts配置文件中进行配置
<package name="imagetest" extends="struts-default" namespace="/">
<action name="image_*" class="imageAction" method="{1}">
</action>
</package>
struts文件上传的注意事项
struts.multipart.maxSize=20697152
- 如果想改变大小,需要在struts的配置文件中进行修改
- 这个的修改的是表单中上传的文件的总大小,如果想要规定单个文件大小,需要使用拦截器
<constant name="struts.multipart.maxSize" value="需要的大小"></constant>
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">所需要设置的单个文件大小</param>
<param name="fileUpload.allowedExtensions">允许上传的文件类型</param>
</interceptor-ref>