标签:trident throws utils ack apach down attach att ide
1.上传:请求request--------》struts2的fileUpload拦截器来解析要上传的文件,拿到相应属性数据注入到action-------------》Action中定义成员属性和set方法,用于注入属性值。fileUpload的拦截器部分命名要求源代码如下所示:
if (files != null && files.length > 0) {
List<File> acceptedFiles = new ArrayList<File>(files.length);
List<String> acceptedContentTypes = new ArrayList<String>(files.length);
List<String> acceptedFileNames = new ArrayList<String>(files.length);
String contentTypeName = inputName + "ContentType";
String fileNameName = inputName + "FileName";
因此做文件上传的action成员属性要规范命名三个属性,分别是:1.表单中用于文件上传的file属性名要与action中File成员变量的名字相同,在此假设均为X;2.action中用于表示上传文件名称的属性filename必须命名为变量X+"FileName",没有中文乱码(框架解决过了);3.action中用于规定文件MIME类型的属性名称必须命名为变量X+“ContentType",示例如下:
前台页面:
<input type="file" name="upload">
后台action:
// 要上传的文件
private File upload;
// 文件的名称(可以是中文,乱码已解决)
private String uploadFileName;
// 文件的MIME的类型
private String uploadContentType;
注:接下来就是这些属性的set方法,用于拦截器向action中注入属性值;文件上传默认大小2M,可在struts2.xml中设置常量修改大小
<constant name="struts.mutipart.maxSize” value="2097152"></constant>
示例代码:
public String save() throws IOException{
// 做文件的上传,说明用户选择了上传的文件了
if(uploadFileName != null) {
// 把文件的名称处理一下,避免文件重名
String uuidname = UploadUtils.getUUIDName(uploadFileName);
String path = "E:\\APP\\apache-tomcat-7.0.70\\upload\\";
// 创建file对象
File file = new File(path+uuidname);
// 简单方式
FileUtils.copyFile(upload, file);
// 把上传的文件的路径,保存到客户表中
customer.setFilepath(path+uuidname);
}
// 保存客户成功了
customerService.save(customer);
return "save";
}
2.下载
文件下载的action必须提供一个返回值类型为Inputstream的get方法,按业务来说前台页面会传来文件存储地址filepath和文件名filename;为了解决下载框在不同浏览器内核下出现乱码的问题,需要进行浏览器内核判断然后进行相应的乱码处理,相应代码如下;
//判断浏览器内核代码
public boolean isMSBrowser(HttpServletRequest request) {
String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
String userAgent = request.getHeader("User-Agent");
for (String signal : IEBrowserSignals) {
if (userAgent.contains(signal)){
return true;
}
}
return false;
}
//解析中文代码
public String getFileName() {
try {
HttpServletRequest request = ServletActionContext.getRequest();
//如果是IE内核使用URLEncoder
if(isMSBrowser(request)){
fileName = URLEncoder.encode("供应商资质", "UTF-8");
}else{//如果是谷歌、火狐则解析为ISO-8859-1
fileName = new String("供应商资质".getBytes("UTF-8"), "ISO-8859-1");
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fileName;
}
//必须提供的返回类型为InputStream的get类型的方法,假设为getXxx(),在该方法里需要再次处理编码
public InputStream getXxx() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
if(isMSBrowser(request)){
fileName = URLEncoder.encode("供应商资质", "UTF-8");
}else{//如果是谷歌、火狐则解析为ISO-8859-1
fileName = new String("供应商资质".getBytes("UTF-8"), "ISO-8859-1");
}
File file = new File(filepath);
return new FileInputStream(file);
}
//struts.xml配置如下
<!-- 配置文件下载 -->
<action name="FileDownloadAction" class="FileDownloadAction">
<result name="success" type="stream">
<param name="contentType">image/jpeg;</param>
<param name="contentDisposition">attachment;filename="${fileName}.jpg"</param>
<param name="inputName">xxx</param>//注意此处命名应与action中定义的流属性名字相同
<param name="bufferSize">81920</param>
</result>
</action>
标签:trident throws utils ack apach down attach att ide
原文地址:https://www.cnblogs.com/tfboy/p/9473803.html