最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

 更新時(shí)間:2015年01月04日 14:35:21   投稿:shichen2014  
這篇文章主要介紹了java中struts2實(shí)現(xiàn)文件上傳下載功能的方法,以實(shí)例形式較為詳細(xì)的分析了struts2實(shí)現(xiàn)文件上傳下載功能的具體實(shí)現(xiàn)技巧與相關(guān)問題的解決方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了java中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)現(xiàn)方法。分享給大家供大家參考。具體分析如下:

1.文件上傳

首先是jsp頁面的代碼

在jsp頁面中定義一個(gè)上傳標(biāo)簽
 

復(fù)制代碼 代碼如下:
<tr>
     <td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>
     <td bgcolor="#FFFFFF">
     <input type="file" name="upload" />
     </td>
     <td bgcolor="#FFFFFF">&nbsp;</td>
</tr>

然后是BaseAction中定義的相關(guān)屬性其它的就省略了(也可定義在自己的Action,換下訪問修飾符即可)
 
復(fù)制代碼 代碼如下:
/**
*Action基類
**/
public class BaseAction extends ActionSupport {
    protected List<File> upload;
    protected List<String> uploadContentType; //文件類型
    protected List<String> uploadFileName;    //文件名
    protected String savePath;                //保存路徑
}

然后是Action中的一個(gè)上傳方法,代碼如下:
復(fù)制代碼 代碼如下:
/**
  * 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("上傳附件錯(cuò)誤。", e);
        }
}

接著是我的struts2.xml文件
復(fù)制代碼 代碼如下:
<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.文件下載

首先是頁面中的下載鏈接

復(fù)制代碼 代碼如下:
<tr>
   <td width="20%" align="right" bgcolor="#F5F8F9"><b>附件:</b></td>
   <td width="40%" bgcolor="#FFFFFF">
   <div style="width:355px; float: left;">${item.accessory}</div>
       <c:if test="${!empty item.accessory}">
           <div class="btn_img" style="float: left;"><a style="color: black; text-decoration: none;" href="download.action?filename=${item.accessory}">下載</a></div>
       </c:if>
   </td>
   <td width="40%" bgcolor="#FFFFFF">&nbsp;</td>
</tr>

接著是DownloadAction的代碼:
復(fù)制代碼 代碼如下:
/**
 * 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() + "http://"+ 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("下載文件信息出錯(cuò)。", 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文件:
 
復(fù)制代碼 代碼如下:
<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>

下載的話注意下編碼格式基本應(yīng)該就沒什么問題了.

上傳過程碰到的問題

1.上傳大文件就出錯(cuò)解決方法1

出現(xiàn)的錯(cuò)誤有如下:

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)

中文意思: 要求被拒絕,因?yàn)樗拇笮。?973652)超過配置的最大值(2097152)、
考慮到用戶體驗(yàn),所以必須在上傳附件時(shí),攔截這樣的異常,解決方法如下:

1、所上傳的文件,在上傳過程中都是先存放在緩存中的,安全起見,還是在項(xiàng)目的struts.properties文件中,加一個(gè)臨時(shí)存放路徑,雖然項(xiàng)目中己經(jīng)設(shè)置好服務(wù)器的物理路徑。
 

復(fù)制代碼 代碼如下:
   struts.multipart.saveDir=/temp

2、考慮到后期可能會(huì)修改文件上傳的大小,所以不管是否默認(rèn),還是在項(xiàng)目的struts.properties文件中,加如下配置:
復(fù)制代碼 代碼如下:
    <!-- 所允許上傳文件的大小2M -->
    <constant name="struts.multipart.maxSize" value="2097152"/>

3、struts.xml配置
 
復(fù)制代碼 代碼如下:
   <!-- 修改問題方法 -->
    <action name="updateProblem" method="updateProblem">
      <interceptor-ref name="fileUpload"/>
      <interceptor-ref name="defaultStack" />
     <result name="input">/page/question/page/problemPage.jsp</result>
    </action>

4、最重要也是最關(guān)鍵的一步

fileUpload攔截器只是當(dāng)文件上傳到服務(wù)器上之后,才進(jìn)行的文件類型和大小判斷。在Action中如果我們什么操作都不做的話,異常就會(huì)展現(xiàn)在用戶的面前,因此想了一個(gè)方法,把該異常信息設(shè)置為Action級(jí)別的錯(cuò)誤信息。即重寫addActionError方法。
 

復(fù)制代碼 代碼如下:
@Override
   public void addActionError(String anErrorMessage) {
    // 這里要先判斷一下,是我們要替換的錯(cuò)誤,才處理
    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 +"字節(jié))超過允許的大?。? + 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中的錯(cuò)誤內(nèi)容。

因?yàn)槲也淮蛩?,在頁面上顯示出來錯(cuò)誤原因,想彈出一個(gè)提示框,所以將信息放入了request對(duì)象中。

而頁面加載時(shí),加了如下js驗(yàn)證:

復(fù)制代碼 代碼如下:
//判斷 文件是否上傳成功
    var message="${request.fileUploadErrorMessage}";
        if(message!=null && ""!=trim(message) && message!="null"){
            self.parent.diag.close();
        alert(message);
        return;
}

下面是一些參考了解東東:

struts.multipart.maxSize掌控整個(gè)項(xiàng)目所上傳文件的最大的Size
struts.multipart.maxSize和fileUpload攔截器的maximumSize屬性分工不同,總結(jié)如下:

1.struts.multipart.maxSize掌控整個(gè)項(xiàng)目所上傳文件的最大的Size。
  超過了這個(gè)size,后臺(tái)報(bào)錯(cuò),程序處理不了如此大的文件。fielderror里面會(huì)有如下的提示:
  the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload攔截器的maximumSize屬性必須小于struts.multipart.maxSize的值。
  struts.multipart.maxSize默認(rèn)2M,當(dāng)maximumSize大于2M時(shí),必須設(shè)置struts.multipart.maxSize的值大于maximumSize。
3.當(dāng)上傳的文件大于struts.multipart.maxSize時(shí),系統(tǒng)報(bào)錯(cuò)
  當(dāng)上傳的文件在struts.multipart.maxSize和maximumSize之間時(shí),系統(tǒng)提示:
  File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
  當(dāng)上傳的文件小于maximumSize,上傳成功。

復(fù)制代碼 代碼如下:
<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>

上傳大文件就出錯(cuò)解決辦法2:

問題:上傳大文件報(bào)錯(cuò)……
解決:修改struts.xml文件中的參數(shù)如下

復(fù)制代碼 代碼如下:
<constant name="struts.multipart.maxSize" value="55000000"/>
<action name="UploadFile" class="com.buptisc.srpms.action.UploadFileAction">
            <result name="UploadFileResult">/m.fzitv.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文件中的大小與實(shí)際文件大小的關(guān)系:1048576(Bytes) = 1024*1024 = 1M實(shí)際文件大小.
struts.multipart.maxSize掌控整個(gè)項(xiàng)目所上傳文件的最大的Size
struts.multipart.maxSize和fileUpload攔截器的maximumSize屬性分工不同,總結(jié)如下:

1.struts.multipart.maxSize掌控整個(gè)項(xiàng)目所上傳文件的最大的Size。超過了這個(gè)size,后臺(tái)報(bào)錯(cuò),程序處理不了如此大的文件。fielderror里面會(huì)有如下的提示:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload攔截器的maximumSize屬性必須小于struts.multipart.maxSize的值。
struts.multipart.maxSize默認(rèn)2M,當(dāng)maximumSize大于2M時(shí),必須設(shè)置struts.multipart.maxSize的值大于maximumSize。
3.當(dāng)上傳的文件大于struts.multipart.maxSize時(shí),系統(tǒng)報(bào)錯(cuò)
當(dāng)上傳的文件在struts.multipart.maxSize和maximumSize之間時(shí),系統(tǒng)提示:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
當(dāng)上傳的文件小于maximumSize,上傳成功。

上傳文件的類型限制

配置fileupload攔截器

struts2的defaultStack中已經(jīng)含有fileupload攔截器,如果想加入allowedTypes參數(shù),需要從新寫一個(gè)defaultstack ,拷貝過來修改一下即可:

復(fù)制代碼 代碼如下:
<interceptors> 
             <interceptor-stack name="myDefaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name=m.fzitv.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>

僅修改代碼中的
復(fù)制代碼 代碼如下:
<interceptor-ref name="fileUpload">
  <param name="allowedTypes">
     image/png,image/gif,image/jpeg
  </param>
</interceptor-ref>

 
攔截器棧在<package>標(biāo)簽內(nèi) <action>標(biāo)簽外配置 如上我們?nèi)绻阉x成默認(rèn)攔截器的話就不需要在

<action>標(biāo)簽中引入,沒有的話需要引入攔截器

復(fù)制代碼 代碼如下:
<action>
       <result name="input">/error/dbError.jsp</result>
       <interceptor-ref name="myDefaultStack"></interceptor-ref>
</action>

  
文件上傳類型錯(cuò)誤action會(huì)直接返回input,所以不需要在action中return "input" ;
 
還可以在<package>標(biāo)簽外定義上傳問價(jià)你的路徑跟大?。?br />
復(fù)制代碼 代碼如下:
<constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constant name="struts.multipart.maxSize" value="1024"></constant>

最最最重要的一點(diǎn):上傳文件的表單 必須加上:enctype="multipart/form-data" 不加必然報(bào)input錯(cuò)誤。

希望本文所述對(duì)大家的Java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java中==符號(hào)與equals()的使用詳解(測試兩個(gè)變量是否相等)

    Java中==符號(hào)與equals()的使用詳解(測試兩個(gè)變量是否相等)

    下面小編就為大家?guī)硪黄狫ava中==符號(hào)與equals()的使用詳解(測試兩個(gè)變量是否相等)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • JAVA socket.io注解原理及用法圖解

    JAVA socket.io注解原理及用法圖解

    這篇文章主要介紹了JAVA socket.io注解原理及用法圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java獲取視頻時(shí)長、大小的示例

    Java獲取視頻時(shí)長、大小的示例

    這篇文章主要介紹了Java獲取視頻時(shí)長、大小的示例,幫助大家利用Java處理視頻,完成需求,感興趣的朋友可以了解下
    2020-11-11
  • 基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)教程

    基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)教程

    這篇文章主要給大家介紹了關(guān)于基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責(zé)分配

    jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責(zé)分配

    這篇文章主要為大家介紹了jvm雙親委派 vs 破壞雙親委派對(duì)比來理解加載器的權(quán)責(zé)分配,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • java開源區(qū)塊鏈初始化創(chuàng)世區(qū)塊jdchain服務(wù)搭建

    java開源區(qū)塊鏈初始化創(chuàng)世區(qū)塊jdchain服務(wù)搭建

    這篇文章主要介紹了java開源區(qū)塊鏈初始化創(chuàng)世區(qū)塊jdchain的服務(wù)搭建步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • Java實(shí)現(xiàn)配置加載機(jī)制

    Java實(shí)現(xiàn)配置加載機(jī)制

    這篇文章主要介紹了Java實(shí)現(xiàn)配置加載機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Spring FreeMarker整合Struts2過程詳解

    Spring FreeMarker整合Struts2過程詳解

    這篇文章主要介紹了Spring FreeMarker整合Struts2過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 解決Lombok注解不起作用的問題

    解決Lombok注解不起作用的問題

    這篇文章主要介紹了解決Lombok注解不起作用的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java--Socket通信(客戶端服務(wù)端雙向)

    Java--Socket通信(客戶端服務(wù)端雙向)

    這篇文章主要介紹了Java--Socket通信(客戶端服務(wù)端雙向),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01

最新評(píng)論

广西| 沭阳县| 建始县| 财经| 双鸭山市| 襄樊市| 青神县| 肥乡县| 改则县| 冷水江市| 小金县| 仁怀市| 南岸区| 通州市| 福建省| 民丰县| 新乡县| 盐山县| 安岳县| 肥西县| 香格里拉县| 濮阳县| 昌平区| 南宁市| 穆棱市| 天峨县| 克拉玛依市| 彭阳县| 宜兴市| 新乡市| 英吉沙县| 浦东新区| 张家界市| 会昌县| 敦煌市| 南岸区| 清苑县| 绥芬河市| 仙居县| 嘉祥县| 丹凤县|