10分 |
用struts2的fileupload
|
30分 |
package com.chzu.tic.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class UploadAction extends TeacherBaseAction{ private static final long serialVersionUID = 1L; private File content;// 文件内容 // 封装上传文件content的类型属性(ContentType)和文件名属性(FileName) private String contentContentType; private String contentFileName; private String savePath;// 上传文件的保存路径,在struts.xml配置相对路径 // 处理登录后的提示信息 private String tip; com.chzu.tic.model.File ticFile=new com.chzu.tic.model.File(); public File getContent() { return content; } public void setContent(File content) { this.content = content; } public String getContentContentType() { return contentContentType; } public void setContentContentType(String contentContentType) { this.contentContentType = contentContentType; } public String getContentFileName() { return contentFileName; } public void setContentFileName(String contentFileName) { this.contentFileName = contentFileName; } /** * @return 上传文件放在d盘upload目录, 加上struts.xml配置文件savePath的值 */ public String getSavePath() { String directory = "D:"+"\"+savePath; File file=new File("D:\upload"); if (!(file.exists())&&!(file.isDirectory())) {//如果upload文件夹不存在 file.mkdirs();//创建upload文件夹 } return directory; } /** * 接收struts.xml配置文件中保存文件的相对路径 * * @param savePath * struts.xml中配置的保存文件路径savePath的值 */ public void setSavePath(String savePath) { this.savePath = savePath; } public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } /** * * 验证用户上传的文件是否存在 */ public Boolean exit(){ if(teacherService.exit(getContentFileName())){//文件已存在 setTip("相同文件名已存在!"); return true; } else { return false; } } public String execute() throws Exception { if(exit()){ return "input"; } // 把上传的文件写入到upload文件夹下 FileOutputStream fos = new FileOutputStream(getSavePath() + "\" + getContentFileName()); FileInputStream fis = new FileInputStream(getContent()); byte[] butter = new byte[1024]; int len = 0; while ((len = fis.read(butter)) > 0) { fos.write(butter, 0, len); } fos.close(); fis.close(); ticFile.setName(getContentFileName()); ticFile.setPath(getSavePath()+"\"+getContentFileName()); teacherService.upload(ticFile); return "success"; } /** * 文件大小大于struts.xml全局上传的文件大小, * 将对参数maximumSize注入失败,即在upload.jsp不能显示上传的文件最大为40M提示 * 重写addActionError方法目的解决struts.xml对内置参数maximumSize可能注入失败 * 另外,在jsp页面会重复提示两次错误信息,原因是用了fileUpload拦截器,又用了默认拦截器 * 不用默认拦截器,收到文件的将为null * @param anErrorMessage * 添加文件大小大于struts.xml全局上传的文件大小错误信息 */ @Override public void addActionError(String anErrorMessage) { //从国际化里取值,网上是说文件过大(超过全局文件上传大小)错误信息是 //以the request was rejected because its size开头 //发现是以Request exceeded allowed size limit开头 if (anErrorMessage .startsWith("Request exceeded allowed size limi")) { super.addActionError(getText("struts.multipart.maxSize.limit")); } else { super.addActionError(anErrorMessage); } } } <!-- 上传文件 Action--> <action name="uploadFileAction" class="com.chzu.tic.action.UploadAction"> <!-- 配置struts自带的文件上传fileUpload拦截器 --> <interceptor-ref name="fileUpload"> <!-- 配置允许上传文件最大为20MB,单位字节 --> <param name="maximumSize">20971520</param> </interceptor-ref> <!-- 需要配置系统默认的的拦截器,在teacherStack拦截器栈中,不然收到文件为null --> <interceptor-ref name="teacherStack"/> <!-- 文件上传存储路径 --> <param name="savePath">upload</param> <result name="success">/WEB-INF/back/success.jsp</result> <result name="input">/WEB-INF/back/teacher/upload.jsp</result> </action> <!-- 下载文件 --> <action name="downloadAction" class="com.chzu.tic.action.DownloadAction"> <interceptor-ref name="teacherStack"/> <result name="success" type="stream"> <param name="inputName">targetFile</param> <!-- 接收DownloadAction为其注入的值 --> <param name="contentDisposition">filename="${fileName}"</param> <param name="bufferSize">4096</param> </result> </action> |