文件上傳的準備:
上傳文件顯然要在表單中寫上,這個文本域會在html頁面中產生一個單行文本瀏覽框,以及一個瀏覽按鈕同時還要設置*entype屬性:
表單的enctype有三個屬性,指定的是表單的編碼方式,經常用的是multipart/form-data:這種方式會以爲二進制流的形式來處理表單數據,這種編碼方式會把文件域指定的內容也封裝到參數內。
同時需要將method設置成post
一般寫法是:
一旦將enctype設置成multipart/form-data形式,瀏覽器將使用二進制流的形式傳送數據,這樣服務器將不能通過request.getParameter();的方式請求數據,在後續的文章中,我們將會詳細的說明該怎樣自己寫一個文件上傳的類,今天先暫時擱置起來
實現文件上傳:
新建一個jsp頁面:內容如下
<body>
<form action="upload.action" method="post" enctype="multipart/form-data">
文件標題:<input type="text" name="title"/>
選擇文件:<input type="file" name="upload"/>
<input type="submit" value="上傳"/>
</form>
</body>
</html>
新建一個action類:
package Action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
//封裝文件標題的請求參數的屬性
private String title;
//封裝上傳文件域的屬性
private File upload;
private String uploadContentType;//文件類型的屬性
private String uploadFileName;//文件名稱
private String savePath;//文件的上傳路徑
public String execute() throws Exception{
String title = getTitle();
System.out.println(title);
String save = getSavePath();
System.out.println(save);//D:/test/upload
String uploadName = getUploadFileName();
System.out.println(uploadName);//20140530165433234.jpg
String url = save+"/"+uploadName;
System.out.println(url);//D:/test/upload/20140530165433234.jpg
File file = new File(save);
if(!file.exists()){
file.mkdirs();
}
FileOutputStream fos = new FileOutputStream(url);
File uplo = getUpload();
FileInputStream fis = new FileInputStream(getUpload());
byte [] buffer = new byte[1024];
int len = 0;
while((len = fis.read(buffer)) > 0){
fos.write(buffer , 0 ,len);
}
return SUCCESS;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="liang" extends="struts-default">
<action name="upload" class="Action.UploadAction">
<!-- 設置要攔截的文件類型 -->
<interceptor-ref name="fileUpload">
<!-- 允許上傳的文件時gif 和jpg 多個類型之間使用,隔開 -->
<param name="allowTypes">image/gif,/image/jpeg</param>
<!-- 允許上傳的文件最大爲20K -->
<param name="maximunSize">20480</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<!-- 動態設置Action的屬性值 -->
<param name="savePath">/upload</param>
<!-- 配置Struts2默認的頁面 -->
<result>/success.jsp</result>
</action>
</package>
</struts>
注意:
我是在struts.xml參數中配置了/upload
所以最終上傳的文件到的文件夾:/upload/20140530165433234.jpg(upload後面的是我上傳的文件名)
一般我們是上傳到項目的目錄下:
下面對文件稍作修改保存在項目的文件下面:
僅僅修改action文件中的getSavePath()方法:
public String getSavePath() {
HttpServletRequest request = ServletActionContext.getRequest();
return request.getRealPath(savePath);
}
這樣:
控制檯打印的就是:
F:\Users.metadata.me_tcat\webapps\test\upload : 這是要上傳的文件目錄,不存在創建
20140530165433234 (1).jpg :要上傳的圖片名
F:\Users.metadata.me_tcat\webapps\test\upload/20140530165433234 (1).jpg 完整目錄
上傳完成之後要跳轉的success.jsp頁面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'success.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
上傳成功!<br/>
<!-- 根據上傳文件的文件名,在頁面中顯示上傳的文件-->
<s:property value="+title"/><br/>
<img src="<s:property value="'upload/'+uploadFileName"/>"/>
</body>
</html>
至此一個單文件的上傳實例已經寫完,action中偶好多System.out.print()之類的語句,這裏僅僅是爲了看明白各個值到底是什麼,也可以用debug模式運行,這樣可以精簡好多代碼