使用struts2控制文件上傳

文件上傳的準備:
上傳文件顯然要在表單中寫上,這個文本域會在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模式運行,這樣可以精簡好多代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章