java中struts2完成文件上傳下載功效實例解析。本站提示廣大學習愛好者:(java中struts2完成文件上傳下載功效實例解析)文章只能為提供參考,不一定能成為您想要的結果。以下是java中struts2完成文件上傳下載功效實例解析正文
本文實例講述了java中struts2完成文件上傳下載功效完成辦法。分享給年夜家供年夜家參考。詳細剖析以下:
1.文件上傳
起首是jsp頁面的代碼
在jsp頁面中界說一個上傳標簽
<tr>
<td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>
<td bgcolor="#FFFFFF">
<input type="file" name="upload" />
</td>
<td bgcolor="#FFFFFF"> </td>
</tr>
然後是BaseAction中界說的相干屬性其它的就省略了(也可界說在本身的Action,換下拜訪潤飾符便可)
/**
*Action基類
**/
public class BaseAction extends ActionSupport {
protected List<File> upload;
protected List<String> uploadContentType; //文件類型
protected List<String> uploadFileName; //文件名
protected String savePath; //保留途徑
}
然後是Action中的一個上傳辦法,代碼以下:
/**
* 8.上傳附件
* @param upload
*/
public void uploadAccess(List<File> upload){
try {
if (null != upload) {
for (int i = 0; i < upload.size(); i++) {
String path = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println(path);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = new FileOutputStream(path);
FileInputStream fis = new FileInputStream(getUpload().get(i));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
}
}
} catch (Exception e) {
logger.error("上傳附件毛病。", e);
}
}
接著是我的struts2.xml文件
<action name="itemRDAction_*" class="itemRDAction" method="{1}">
<param name="savePath">e:upload</param>
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">
application/octet-stream,image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel
</param>
<param name="fileUpload.maximumSize">8000000</param>
</interceptor-ref>
<result name="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<result name="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<result name="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</action>
savePath為保留途徑,fileUpload.allowedTypes 用來限制上傳文件類型 fileUpload.maximumSize 文件年夜小限制
2.文件下載
起首是頁面中的下載鏈接
<tr>
<td width="20%" align="right" bgcolor="#F5F8F9"><b>附件:</b></td>
<td width="40%" bgcolor="#FFFFFF">
<div >${item.accessory}</div>
<c:if test="${!empty item.accessory}">
<div class="btn_img" ><a href="download.action?filename=${item.accessory}">下載</a></div>
</c:if>
</td>
<td width="40%" bgcolor="#FFFFFF"> </td>
</tr>
接著是DownloadAction的代碼:
/**
* DownloadAction
*
* @author zhaoxz
*
*/
@Controller("downloadAction")
@Scope("prototype")
public class DownloadAction extends BaseAction {
/**
*
*/
private static final long serialVersionUID = -4278687717124480968L;
private static Logger logger = Logger.getLogger(DownloadAction.class);
private String filename;
private InputStream inputStream;
private String savePath;
private String mimeType;
public InputStream getInputStream() {
try {
String path = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println(path);
mimeType = ServletActionContext.getServletContext().getMimeType(path)+ ";charset=UTF-8";
inputStream = new FileInputStream(path);
String agent = request.getHeader("USER-AGENT");
System.out.println(agent);
if (null != agent) {
if (-1 != agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} else {// IE7+ Chrome
System.out.println("IE,Chrome");
filename = new String(filename.getBytes("ISO8859-1"),"utf-8");
filename = java.net.URLEncoder.encode(filename, "UTF-8");
}
}
} catch (Exception e) {
logger.error("下載文件信息失足。", e);
}
if (null == inputStream) {
System.out.println("getResource error");
}
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
/*************************** get set ******************************/
public String getSavePath() {
return this.savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
}
然後是它的struts2.xml文件:
<action name="download" class="downloadAction">
<param name="savePath">E:/upload</param>
<result type="stream">
<param name="contentType">${mimeType}</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="inputName">inputStream</param>
</result>
</action>
下載的話留意下編碼格局根本應當就沒甚麼成績了.
上傳進程碰著的成績
1.上傳年夜文件就失足處理辦法1
湧現的毛病有以下:
1、2012-02-24 11:06:31,937 ERROR (org.apache.struts2.dispatcher.Dispatcher:512) - Could not find action or result
No result defined for action com.iman.portal.action.QuestionActionImpl and result problemPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51:55
2、the request was rejected because its size (2973652) exceeds the configured maximum (2097152)
中辭意思: 請求被謝絕,由於它的年夜小(2973652)跨越設置裝備擺設的最年夜值(2097152)、
斟酌到用戶體驗,所以必需在上傳附件時,攔阻如許的異常,處理辦法以下:
1、所上傳的文件,在上傳進程中都是先寄存在緩存中的,平安起見,照樣在項目標struts.properties文件中,加一個暫時寄存途徑,固然項目中己經設置好辦事器的物理途徑。
struts.multipart.saveDir=/temp
2、斟酌到前期能夠會修正文件上傳的年夜小,所以不論能否默許,照樣在項目標struts.properties文件中,加以下設置裝備擺設:
<!-- 所許可上傳文件的年夜小2M -->
<constant name="struts.multipart.maxSize" value="2097152"/>
3、struts.xml設置裝備擺設
<!-- 修正成績辦法 -->
<action name="updateProblem" method="updateProblem">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack" />
<result name="input">/page/question/page/problemPage.jsp</result>
</action>
4、最主要也是最症結的一步
fileUpload攔阻器只是當文件上傳到辦事器上以後,才停止的文件類型和年夜小斷定。在Action中假如我們甚麼操作都不做的話,異常就會展示在用戶的眼前,是以想了一個辦法,把該異常信息設置為Action級其余毛病信息。即重寫addActionError辦法。
@Override
public void addActionError(String anErrorMessage) {
// 這裡要先斷定一下,是我們要調換的毛病,才處置
if (anErrorMessage.startsWith("the request was rejected because its size")) {
Pattern pattern = Pattern.compile("d+");
Matcher m = pattern.matcher(anErrorMessage);
// 婚配一次
m.find();
String s1 =m.group();//上傳的文件年夜小
// 再婚配一次
m.find();
String s2 =m.group();//所限制的年夜小
if(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="你上傳的文件年夜小(" + Long.valueOf(s1)/1024 +"字節)跨越許可的年夜小(" + Long.valueOf(s2)/1024/1024 + "M)";
getRequest().setAttribute("fileUploadErrorMessage","文件太年夜,跨越了許可的年夜小("+Long.valueOf(s2)/1024/1024+"M),上傳掉敗!");
// 將信息調換失落
super.addActionError(fileUploadErrorMessage);
}
} else {// 不然按本來的辦法處置
super.addActionError(anErrorMessage);
}
}
可以,在前往頁面用<s:fielderror/> <s:fielderror/>,獲得addActionError中的毛病內容。
由於我不盤算,在頁面上顯示出來毛病緣由,想彈出一個提醒框,所以將信息放入了request對象中。
而頁面加載時,加了以下js驗證:
//斷定 文件能否上傳勝利
var message="${request.fileUploadErrorMessage}";
if(message!=null && ""!=trim(message) && message!="null"){
self.parent.diag.close();
alert(message);
return;
}
上面是一些參考懂得東東:
struts.multipart.maxSize掌控全部項目所上傳文件的最年夜的Size
struts.multipart.maxSize和fileUpload攔阻器的maximumSize屬性分工分歧,總結以下:
1.struts.multipart.maxSize掌控全部項目所上傳文件的最年夜的Size。
跨越了這個size,後台報錯,法式處置不了如斯年夜的文件。fielderror外面會有以下的提醒:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload攔阻器的maximumSize屬性必需小於struts.multipart.maxSize的值。
struts.multipart.maxSize默許2M,當maximumSize年夜於2M時,必需設置struts.multipart.maxSize的值年夜於maximumSize。
3.當上傳的文件年夜於struts.multipart.maxSize時,體系報錯
當上傳的文件在struts.multipart.maxSize和maximumSize之間時,體系提醒:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
當上傳的文件小於maximumSize,上傳勝利。
<action name="UploadFile" class="com.buptisc.srpms.action.UploadFileAction">
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
上傳年夜文件就失足處理方法2:
成績:上傳年夜文件報錯……
處理:修正struts.xml文件中的參數以下
<constant name="struts.multipart.maxSize" value="55000000"/>
<action name="UploadFile" class="com.buptisc.srpms.action.UploadFileAction">
<result name="UploadFileResult">/www.jb51.net/ ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
struts.xml文件中的年夜小與現實文件年夜小的關系:1048576(Bytes) = 1024*1024 = 1M現實文件年夜小.
struts.multipart.maxSize掌控全部項目所上傳文件的最年夜的Size
struts.multipart.maxSize和fileUpload攔阻器的maximumSize屬性分工分歧,總結以下:
1.struts.multipart.maxSize掌控全部項目所上傳文件的最年夜的Size。跨越了這個size,後台報錯,法式處置不了如斯年夜的文件。fielderror外面會有以下的提醒:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload攔阻器的maximumSize屬性必需小於struts.multipart.maxSize的值。
struts.multipart.maxSize默許2M,當maximumSize年夜於2M時,必需設置struts.multipart.maxSize的值年夜於maximumSize。
3.當上傳的文件年夜於struts.multipart.maxSize時,體系報錯
當上傳的文件在struts.multipart.maxSize和maximumSize之間時,體系提醒:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
當上傳的文件小於maximumSize,上傳勝利。
上傳文件的類型限制
設置裝備擺設fileupload攔阻器
struts2的defaultStack中曾經含有fileupload攔阻器,假如想參加allowedTypes參數,須要重新寫一個defaultstack ,拷貝過去修正一下便可:
<interceptors>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name=www.jb51.net/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/png,image/gif,image/jpeg
</param>
</interceptor-ref>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo..*,^struts..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
僅修正代碼中的
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/png,image/gif,image/jpeg
</param>
</interceptor-ref>
攔阻器棧在<package>標簽內 <action>標簽外設置裝備擺設 如上我們假如把它界說成默許攔阻器的話就不須要在
<action>標簽中引入,沒有的話須要引入攔阻器
<action>
<result name="input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</action>
文件上傳類型毛病action會直接前往input,所以不須要在action中return "input" ;
還可以在<package>標簽外界說上傳問價你的途徑跟年夜小:
<constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constant name="struts.multipart.maxSize" value="1024"></constant>
最最最主要的一點:上傳文件的表單 必需加上:enctype="multipart/form-data" 不加必定報input毛病。
願望本文所述對年夜家的Java法式設計有所贊助。