文件上传
将本地文件通过流的形式上传到服务器上。
文件上传技术
- JspSmartUpload
jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用到的上传下载组件,使用简单,方便。现在又为其加上了下载中文名字的文件的支持。
- FileUpload
是Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名。
- Servlet3.0
- 文件上传
- 注解开发
- 异步请求
- Struts2框架
底层的实现是FileUpload,对FileUpload进行封装。
文件上传要素
- 表单的提交方式必须是POST;
- 表单中需要提供<input type="file" name="upload">,而且这个文件必须有name和属性值;
- 表单的enctype属性必须是multipart/form-data。
使用Struts2实现文件上传
- Struts2的文件上传:
- 在Action中提供三个属性,对三个属性提供set方法
- 字符串类型 上传项名称+FileName
- 文件类型 上传项名称
- 字符串类型 上传项名称+ContentType
- 在Action中提供三个属性,对三个属性提供set方法
private String uploadFileName;
private File upload;
private String uploadContentType;
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
创建UploadUtils类
public class UploadUtils {
/**
* 解决目录下文件名重复的问题
* @param fileName
* @return
*/
public static String getUuidFileName(String fileName) {
int index = fileName.lastIndexOf("."); //获得”aa.txt“中.的位置索引
String extions = fileName.substring(index); //获得文件的后缀扩展名
return UUID.randomUUID().toString().replace("-", "")+extions;
}
/**
* 解决目录重复的问题
* @return
*/
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;
}
public static void main(String[] args) {
System.out.println(getUuidFileName("aa.txt"));
}
}
上传文件代码
public String save() throws IOException {
if(upload!=null) {
//文件上传
//设置文件上传路径
String path = "D:/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);
}
customerService.save(customer);
return "saveSuccess";
}
Struts2中的default.properties有struts.multipart.maxSize=2097152即上传文件的总大小,默认是2M,在struts.xml文件中对其重新设置:
<!-- 配置Struts2中所上传文件的总大小 -->
<constant name="struts.multipart.maxSize" value="5242880"></constant>
Struts2的拦截器中对单个上传文件的大小和类型都有设置,同样在struts.xml中对其重新配置:
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">2097152</param>
<param name="fileUpload.allowedExtensions">.jpg</param>
</interceptor-ref>
注意:配置input逻辑视图,若没有配置,出现错误时报input错误,如下:
配置input逻辑视图:
在页面中添加如下:
配置input后上传错误文件时不会报错,出现如下画面: