Posted on 2009-05-22 23:06
啥都寫點 閱讀(1085)
評論(1) 編輯 收藏 所屬分類:
J2EE
關于如何在項目中添加struts2這里就不在多說了,struts2上傳下載所需要的jar包大家可以去www.apache.org進行下載,在Jakarta下的選擇
Commons,然后下載FileUpload 和 IO這兩個jar包。解壓后拷貝到你的項目lib文件夾下就OK了。
下面直接開始struts2的上傳:
首先創建一個文件上傳的Action,以下注釋部分為批量上傳時的代碼,大同小異!
public class UploadAction extends ActionSupport {
。。。省略了 getter 和 setter方法
private String title;
//單個文件
private File upload;
// 多個文件
// private String[] upload;
//保存上傳文件的文件夾名字,可在配置文件中動態指定
private String savePath;
private String uploadContentType;
private String uploadFileName;
public String getSavePath() {
String s = ServletActionContext.getRequest().getRealPath(savePath);
System.out.println(s);
return s;
}
@Override
public String execute() throws Exception {
System.out.println("進入 execute方法");
//查看上傳文件的大小
System.out.println("所上傳的文件的大小為"+getUpload().length());
//查看上傳文件的名字
System.out.println("UploadFileName:"+getUploadFileName());
//指定上傳文件到哪個文件夾
FileOutputStream fos = new FileOutputStream(savePath+"\\"
+getUploadFileName());
//取得一個將要上傳的文件的一個輸入流
FileInputStream fis = new FileInputStream(getUpload());
//當圖片需要存儲進數據庫時,可以將圖片的連接存儲進數據庫,譬如:
//path路徑是需要讀進數據庫滴,所以這里不能使用 getSavePath(),因為這樣返回的是絕對路徑。
String path = savePath+"\\"+getUploadFileName();
byte[] buffer = new byte[1024];
int len = 0 ;
while((len = fis.read(buffer))>0) {
fos.write(buffer, 0, len);
}
System.out.println("文件已上傳");
return SUCCESS;
}
//完成多個文件的上傳
// public String execute() throws Exception {
//
//
// //查看上傳文件的名字
// System.out.println("UploadFileName:"+getUploadFileName());
//
// //指定上傳文件到哪個文件夾
// FileOutputStream fos = new FileOutputStream(savePath+"\\"
// +getUploadFileName());
//
// String[] ss = getUpload();
// for(int i=0;i<ss.length;i++){
// //取得一個將要上傳的文件的一個輸入流
// FileInputStream fis = new FileInputStream(ss[i]);
//
// //當圖片需要存儲進數據庫時,可以將圖片的連接存儲進數據庫,譬如:
// //path路徑是需要讀進數據庫滴
// String path = savePath+"\\"+getUploadFileName();
//
// byte[] buffer = new byte[1024];
//
// int len = 0 ;
//
// while((len = fis.read(buffer))>0) {
// fos.write(buffer, 0, len);
// }
// return SUCCESS ;
// }
}
文件上傳的頁面index.jsp
<body>
<s:fielderror/>
<s:form action="ryanUpload" enctype="multipart/form-data">
<s:textfield label="title" name="title"/>
<!-- 單個文件上傳 -->
<s:file name="upload" label="文件1"/>
<!-- 多個文件上傳
<s:file name="upload" label="文件1"/>
<s:file name="upload" label="文件2"/>
<s:file name="upload" label="文件3"/>
-->
<s:submit/>
</s:form>
</body>
在來看看struts.xml中的配置,
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="ryan" extends="struts-default">
<action name="ryanUpload" class="com.UploadAction">
<result name="success">/succ.jsp</result>
<result name="input">/index.jsp</result>
<!-- 動態指定上傳文件的目錄 -->
<param name="savePath">/upload</param> <!-- 在此處可以動態的指定服務器上存儲圖片的文件夾 -->
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<param name="maximumSize">3000000000</param> <!-- 這里的單位為字節 -->
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</action>
</package>
</struts>
struts2下載(參考了beansoft的文章):
一般在項目中所用到下載都是直接根據數據庫讀出的地址來進行下載,譬如有下面一個鏈接:
<!-- 假設有這樣一條從數據庫中讀出的數據 ,它的存儲路徑為 downLoad/ryan.jsp ,文件名字為ryan.jsp
很明顯這是一張圖片,那么我們點擊下載時就會根據path來進行下載
-->
<s:url action="downLoad" id="down">
<s:param name="inputPath">downLoad/ryan.jsp</s:param>
<s:param name="fileName">ryan.jsp</s:param>
</s:url>
<s:a href="%{down}">downLoad</s:a>
來看看我們的struts.xml中的配置
<struts>
<package name="technicalInformationAction" extends="Action">
<default-action-ref name="download"/>
<action name="downLoad" class="com.DownLoadAction">
<!--這里的返回值并不是字符串,而是一個流類型-->
<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="inputName">inputStream</param>
<!--這里需要將文件名進行轉碼,轉碼后將值賦予downloadFileName, 對應文中的getDownloadFileName()-->
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
下載文件的DownLoadAction:
public class DownLoadAction implements Action{
private String fileName;// 初始的通過param指定的文件名屬性
private String inputPath;// 指定要被下載的文件路徑
String username = "chenyanhu";
public InputStream getInputStream() throws Exception {
// 通過 ServletContext,也就是application 來讀取數據
return ServletActionContext.getServletContext().getResourceAsStream("/"+inputPath);
}
/**
* execute中代碼的含義是為了防止他人惡意的下載項目的WEB-INF/web.xml文件,譬如在瀏覽器中輸入
* http://......./downLoad.action?inputPath=WEB-INF/web.xml 這樣將下載下的文件后綴名改為xml就可以查看你的項目的web.xml了
* execute中代碼的意思是將文件存儲的真實目錄與地址欄的路徑進行對比。發現企圖下載不在/download下的文件,就顯示內容為空
*/
public String execute(){
// 文件下載目錄路徑
String downloadDir = ServletActionContext.getServletContext().getRealPath("/technicalInformationDirectory"+"/"+username);
// 文件下載路徑
String downloadFile = ServletActionContext.getServletContext().getRealPath("/"+inputPath);
java.io.File file = new java.io.File(downloadFile);
try{
downloadFile = file.getCanonicalPath();// 真實文件路徑,去掉里面的..等信息
if(!downloadFile.startsWith(downloadDir)) {
return null;
}
}catch (IOException io) {
// TODO: handle exception
System.out.println("IO異常??!路徑發生錯誤!");
io.printStackTrace();
}catch (SecurityException se) {
// TODO: handle exception
System.out.println("安全性異常!!");
se.printStackTrace();
}catch (NullPointerException npe ) {
System.out.println("空指針異常");
npe.printStackTrace();
}catch (Exception e) {
System.out.println("出現異常了!");
e.printStackTrace();
}
return SUCCESS;
}
// 提供轉換編碼后的供下載用的文件名
public String getDownloadFileName() {
String downFileName = fileName;
try {
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downFileName;
}
}
關于中文轉碼的問題:
我在項目中遇到了一個問題,那就是下載文件的時候,不能對含有中文名字的文件進行下載,老是出現亂碼,但是數據庫中
是沒有亂碼的,今天花了比較長的時間去解決這個問題,不過現在我已經把這個問題解決, 就是需要修改tomcat的server.xml文件 :
<Connector port="8641" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8"/>
加上紅色部分就OK了??!
--
學海無涯