JavaWeb文件上傳下載功效深刻剖析(二)。本站提示廣大學習愛好者:(JavaWeb文件上傳下載功效深刻剖析(二))文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb文件上傳下載功效深刻剖析(二)正文
接著上一篇論述:
2、文件上傳與下載
Struts2開辟的三板斧,頁面jsp—設置裝備擺設文件struts2.xml—-還有舉措類Action
文件上傳條件:
form表單的method必需是post
form表單的enctype必需是multipart/form-data
供給type=”file”的上傳輸出域
Struts 對文件上傳的支撐的一些規矩
1、單文件上傳
開辟步調:
1)、在WEB-INF/lib下參加commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar。這兩個文件可以從http://commons.apache.org/下載
2)、第二步:編寫upfile.jsp ,把form表的enctype設置為:“multipart/form-data“,以下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<body>
<s:actionerror/>
<hr/>
<s:fielderror></s:fielderror>
<form action="${pageContext.request.contextPath}/upload1.action" method="post" enctype="multipart/form-data"><!-- 以MIME的方法傳遞
-->
用戶名:<input type="text" name="username"/><br/>
靓照:<input type="file" name="photo"/><br/>
<input type="submit" value="上傳"/>
</form>
</body>
編寫毛病頁面error.jsp
<body> 辦事器忙,一會再試。 </body>
success.jsp
<body> 上傳勝利 </body>
3)、編寫UploadAction1 類:在Action類中添加屬性,屬性對應於表單中文件字段的稱號:
package com.itheima.actions;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
//文件上傳:fileUpload攔阻器完成的
public class UploadAction1 extends ActionSupport {
private String username;
private File photo;//和表單的上傳字段名堅持分歧。類型是File類型的
private String photoFileName;//上傳的文件名
private String photoContentType;//上傳文件的MIME類型
//省略getter和setter辦法
public String upload(){
System.out.println(photoFileName+":"+photoContentType);
//通俗字段:
System.out.println(username);
//上傳字段:上傳到某個文件夾。存到運用的images目次下
String realPath = ServletActionContext.getServletContext().getRealPath("/images");
File directory = new File(realPath);
if(!directory.exists()){
directory.mkdirs();
}
try {
FileUtils.copyFile(photo, new File(directory, photoFileName));
return SUCCESS;
} catch (IOException e) {
e.printStackTrace();
return ERROR;
}
}
}
在struts.xml文件中增長以下設置裝備擺設
<action name="upload1" class="com.itheima.actions.UploadAction1" method="upload">
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">image/jpeg,image/png</param>
<param name="fileUpload.allowedExtensionsSet">jpg,jpeg,png</param>
</interceptor-ref>
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
<result name="input">/index.jsp</result>
</action>
道理剖析:
a 、FileUpload 攔阻器擔任處置文件的上傳操作, 它是默許的 defaultStack 攔阻器棧的一員. 攔阻器有 3 個屬性可以設置.
•maximumSize: 上傳文件的最年夜長度(以字節為單元), 默許值為 2 MB
•allowedTypes: 許可上傳文件的類型, 各類型之間以逗號分隔
•allowedExtensions: 許可上傳文件擴大名, 各擴大名之間以逗號分隔
可以在 struts.xml 文件中籠罩這 3 個屬性
b、超越年夜小或不法文件的上傳,會報錯(轉向一個input的視圖)
經由過程:
<s:actionError/> <s:feildError/>顯示毛病新聞的提醒
c、毛病新聞提醒改成中文版:借助國際化的新聞資本文件
假如是經由過程設置裝備擺設全局默許參數惹起的毛病,最好用全局的新聞資本文件。
struts2默許的提醒資本文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比著key值籠罩對應的value便可。
設置裝備擺設以下:
struts.messages.error.uploading=Error uploading: {0}
struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}
{0}:<input type=“file” name=“uploadImage”>中name屬性的值
{1}:上傳文件的真實稱號
{2}:上傳文件保留莅臨時目次的稱號
{3}:上傳文件的類型(對struts.messages.error.file.too.large是上傳文件的年夜小)
源碼:
修正顯示毛病的資本文件的信息
第一步:創立新的資本文件 例如fileuploadmessage.properties,放置在src下
在該資本文件中增長以下信息
struts.messages.error.uploading=上傳毛病: {0}
struts.messages.error.file.too.large=上傳文件太年夜: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=上傳文件的類型不許可: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=上傳文件的後綴名不許可: {0} "{1}" "{2}" {3}
第二步:在struts.xml文件加載該資本文件
<!-- 設置裝備擺設上傳文件的失足信息的資本文件 -->
<constant name="struts.custom.i18n.resources" value=“cn….xxx.fileuploadmessage“/>
2、多文件上傳
上傳多個文件, 可使用數組或 List,其他和單文件上傳相似。
package com.itheima.actions;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
//文件上傳:fileUpload攔阻器完成的
public class UploadAction2 extends ActionSupport {
private String username;
private File[] photo;//和表單的上傳字段名堅持分歧。類型是File類型的 .數組或List
private String[] photoFileName;//上傳的文件名
private String[] photoContentType;//上傳文件的MIME類型
public String upload(){
//上傳字段:上傳到某個文件夾。存到運用的images目次下
String realPath = ServletActionContext.getServletContext().getRealPath("/images");
File directory = new File(realPath);
if(!directory.exists()){
directory.mkdirs();
}
try {
for(int i=0;i<photo.length;i++){
FileUtils.copyFile(photo[i], new File(directory, photoFileName[i]));
}
return SUCCESS;
} catch (IOException e) {
e.printStackTrace();
return ERROR;
}
}
}
3、文件下載
道理:struts2供給了stream成果類型,該成果類型就是專門用於支撐文件下載功效的
指定stream成果類型 須要指定一個 inputName參數,該參數指定一個輸出流,供給被下載文件的進口
編碼步調:
1)、舉措類DownloadAction :
package com.itheima.actions;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URLEncoder;
import org.apache.commons.io.FilenameUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport {
private InputStream image;//用in有成績的
private String filename;//文件名
private long filesize;
public InputStream getImage() {
return image;
}
public void setImage(InputStream image) {
this.image = image;
}
public String getFilename() {
return filename;
}
public long getFilesize() {
return filesize;
}
public String download() throws Exception{
//給image字撙節賦值
String fileRealPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/classes/霉女.jpg");
filename = FilenameUtils.getName(fileRealPath);
//方法一:中文文件要停止URL編碼
// filename = URLEncoder.encode(filename, "UTF-8");
filesize = new File(fileRealPath).length();
System.out.println(filename);
image = new FileInputStream(fileRealPath);
return SUCCESS;
}
}
struts.xml設置裝備擺設文件:重要是對stream類型的成果停止設置裝備擺設
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
<action name="download" class="com.itheima.actions.DownloadAction" method="download">
<result type="stream">
<param name="inputName">image</param><!--舉措類中InputStream的字段名,須要在Action中供給getTargetFile辦法,前往inputStream-->
<param name="contentType">application/octet-stream</param><!--告知閱讀器呼應頭,文件的MIME格局,挪用Action中的getContentType辦法-->
<!-- 在struts.xml中應用OGNL表達式獲得舉措類中屬性的值。 挪用舉措類中的 getFilename()-->
<!-- 中文文件名編碼:方法二.應用OGNL表達式,挪用URLEncode的靜態辦法 -->
<!-- 默許OGNL挪用靜態辦法是不可的,須要開啟一個常量開關.struts.ognl.allowStaticMethodAccess=true -->
<param name="contentDisposition">attachment;filename=${@java.net.URLEncoder@encode(filename,'UTF-8')}</param><!-- 告知閱讀器的下載方法-->
<param name="contentLength">${filesize}</param>
</result>
</action>
</package>
</struts>
攔阻器和文件上傳就寫到這裡了,好累,不外造詣感滿滿的。
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。