<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    Struts2教程7:上傳任意多個(gè)文件

    本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!

    上一篇:Struts2教程6:在Action類中獲得HttpServletResponse對(duì)象的四種方法


    一、上傳單個(gè)文件

        上傳文件是很多Web程序都具有的功能。在Struts1.x中已經(jīng)提供了用于上傳文件的組件。而在Struts2中提供了一個(gè)更為容易操作的上傳文件組件。所不同的是,Struts1.x的上傳組件需要一個(gè)ActionForm來(lái)傳遞文件,而Struts2的上傳組件是一個(gè)攔截器(這個(gè)攔截器不用配置,是自動(dòng)裝載的)。在本文中先介紹一下如何用struts2上傳單個(gè)文件,最后介紹一下用struts2上傳任意多個(gè)文件。

        要用Struts2實(shí)現(xiàn)上傳單個(gè)文件的功能非常容易實(shí)現(xiàn),只要使用普通的Action即可。但為了獲得一些上傳文件的信息,如上傳文件名、上傳文件類型以及上傳文件的Stream對(duì)象,就需要按著一定規(guī)則來(lái)為Action類增加一些gettersetter方法。

        Struts2中,用于獲得和設(shè)置java.io.File對(duì)象(Struts2將文件上傳到臨時(shí)路徑,并使用java.io.File打開(kāi)這個(gè)臨時(shí)文件)的方法是getUploadsetUpload。獲得和設(shè)置文件名的方法是getUploadFileNamesetUploadFileName,獲得和設(shè)置上傳文件內(nèi)容類型的方法是getUploadContentTypesetUploadContentType。下面是用于上傳的動(dòng)作類的完整代碼:


    package action;

    import java.io.*;
    import com.opensymphony.xwork2.ActionSupport;

    public class UploadAction extends ActionSupport 
    {
        
    private File upload;
        
    private String uploadFileName;
        
    private String uploadContentType;
        
        
    public String getUploadFileName()
        {
            
    return uploadFileName;
        }

        
    public void setUploadFileName(String fileName)
        {
            
    this.uploadFileName = fileName;
        }

        
    public File getUpload()
        {
            
    return upload;
        }

        
    public void setUpload(File upload)
        {
            
    this.upload = upload;
        }
        
    public void setUploadContentType(String contentType)
        {
            
    this.uploadContentType=contentType;
        
        }
        
        
    public String getUploadContentType()
        {
            
    return this.uploadContentType;
        }
        
    public String execute() throws Exception
        {   
            java.io.InputStream is 
    = new java.io.FileInputStream(upload);
            java.io.OutputStream os 
    = new java.io.FileOutputStream("d:\\upload\\" + uploadFileName);
            
    byte buffer[] = new byte[8192];
            
    int count = 0;
            
    while((count = is.read(buffer)) > 0)
            {
                os.write(buffer, 
    0, count);
            }
            os.close();
            is.close();
            
    return SUCCESS;
        }
    }

        在execute方法中的實(shí)現(xiàn)代碼就很簡(jiǎn)單了,只是從臨時(shí)文件復(fù)制到指定的路徑(在這里是d:\upload)中。上傳文件的臨時(shí)目錄的默認(rèn)值是javax.servlet.context.tempdir的值,但可以通過(guò)struts.properties(和struts.xml在同一個(gè)目錄下)的struts.multipart.saveDir屬性設(shè)置。Struts2上傳文件的默認(rèn)大小限制是2M2097152字節(jié)),也可以通過(guò)struts.properties文件中的struts.multipart.maxSize修改,如struts.multipart.maxSize=2048 表示一次上傳文件的總大小不能超過(guò)2K字節(jié)。

        下面的代碼是上傳文件的JSP頁(yè)面代碼


    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>

    <html>
        
    <head>
            
    <title>上傳單個(gè)文件</title>
        
    </head>

        
    <body>
            
    <s:form action="upload" namespace="/test"
                enctype
    ="multipart/form-data">
                
    <s:file name="upload" label="輸入要上傳的文件名" />
                
    <s:submit value="上傳" />
            
    </s:form>

        
    </body>
    </html>

    也可以在success.jsp頁(yè)中通過(guò)<s:property>獲得文件的屬性文件名和文件內(nèi)容類型),代碼如下

        <s:property value="uploadFileName"/>

    二、上傳任意多個(gè)文件

        Struts2中,上傳任意多個(gè)文件也非常容易實(shí)現(xiàn)。首先,要想上傳任意多個(gè)文件,需要在客戶端使用DOM技術(shù)生成任意多個(gè)<input type=”file” />標(biāo)簽。name屬性值都相同。代碼如下:

    <html>
        
    <head>
            
    <script language="javascript">

    function addComponent()
    {
            
    var uploadHTML = document.createElement( "<input type='file'  name='upload'/>");
            document.getElementById(
    "files").appendChild(uploadHTML);
            uploadHTML 
    = document.createElement( "<p/>");
            document.getElementById(
    "files").appendChild(uploadHTML);
    }
    </script>
        
    </head>
        
    <body>
            
    <input type="button" onclick="addComponent();" value="添加文件" />
            
    <br />
            
    <form onsubmit="return true;" action="/struts2/test/upload.action"
                method
    ="post" enctype="multipart/form-data">
                
    <span id="files"> <input type='file' name='upload' />
                    
    </>
                
    </span>
                
    <input type="submit" value="上傳" />
            
    </form>
        
    </body>

    </html>
         上面的javascript代碼可以生成任意多個(gè)<input type=’file’>標(biāo)簽,name的值都為file(要注意的是,上面的javascript代碼只適合于IE瀏覽器,firefox等其他瀏覽器需要使用他的代碼)。至于Action類,和上傳單個(gè)文件的Action類基本一至,只需要將三個(gè)屬性的類型改為List即可。代碼如下:
    package action;

    import java.io.*;
    import com.opensymphony.xwork2.ActionSupport;

    public class UploadMoreAction extends ActionSupport
    {
        
    private java.util.List<File> uploads;
        
    private java.util.List<String> uploadsFileName;
        
    private java.util.List<String> uploadsContentType;

        
    public java.util.List<String> getUploadsFileName()
        {
            
    return uploadFileName;
        }
        
    public void setUploadFileName(java.util.List<String> fileNames)
        {
            
    this.uploadFileName = fileNames;
        }
        
    public java.util.List<File> getUploads()
        {
            
    return uploads;
        }

        
    public void setUploads(java.util.List<File> uploads)
        {
            
    this.uploads = uploads;
        }

        
    public void setUploadsContentType(java.util.List<String> contentTypes)
        {
            
    this.uploadsContentType = contentTypes;

        }

        
    public java.util.List<String> getUploadsContentType()
        {
            
    return this.uploadsContentType;
        }

        
    public String execute() throws Exception
        {
            
    if (uploads != null)
            {
                
    int i = 0;
                
    for (; i < uploads.size(); i++)
                {
                    java.io.InputStream is 
    = new java.io.FileInputStream(uploads.get(i));
                    java.io.OutputStream os 
    = new java.io.FileOutputStream(
                            
    "d:\\upload\\" + uploadsFileName.get(i));
                    
    byte buffer[] = new byte[8192];
                    
    int count = 0;
                    
    while ((count = is.read(buffer)) > 0)
                    {
                        os.write(buffer, 
    0, count);
                    }
                    os.close();
                    is.close();
                }
            }
            
    return SUCCESS;
        }
    }

        在execute方法中,只是對(duì)List對(duì)象進(jìn)行枚舉,在循環(huán)中的代碼和上傳單個(gè)文件時(shí)的代碼基本相同。如果讀者使用過(guò)struts1.x的上傳組件,是不是感覺(jué)Struts2的上傳功能更容易實(shí)現(xiàn)呢?Struts1.x中上傳多個(gè)文件時(shí),可是需要建立帶索引的屬性的。而在Struts2中,就是這么簡(jiǎn)單就搞定了。1是上傳任意多個(gè)文件的界面。



    1

        在本文中給出了用Struts2上傳任意多個(gè)文件的一個(gè)方法,如果哪位讀者有更好的方法,請(qǐng)跟貼!

    下一篇:Struts2教程8:攔截器概述






    Android開(kāi)發(fā)完全講義(第2版)(本書(shū)版權(quán)已輸出到臺(tái)灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2008-04-27 21:47 銀河使者 閱讀(24695) 評(píng)論(40)  編輯  收藏 所屬分類: Struts2 原創(chuàng)

    評(píng)論

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    http://www.tudousee.cn 土豆網(wǎng)電視劇前線 這個(gè)網(wǎng)站的上傳也是用這個(gè)的說(shuō).
    2008-04-28 10:57 | 王能

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    這個(gè)上傳我做了好多次,就算一模一樣也不能運(yùn)行正常,請(qǐng)指教一下。
    QQ:287112724
    2008-05-19 16:04 | muboy

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    出現(xiàn)什么錯(cuò)誤,請(qǐng)?jiān)敿?xì)說(shuō)一下,
    2008-05-19 16:13 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    一直報(bào)一個(gè)http500錯(cuò)誤
    異常如下
    java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]
    com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:136)
    com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:476)
    com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:486)
    com.opensymphony.xwork2.inject.ContainerImpl$9.call(ContainerImpl.java:517)
    com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:542)
    com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:515)
    org.apache.struts2.dispatcher.Dispatcher.wrapRequest(Dispatcher.java:697)
    org.apache.struts2.dispatcher.FilterDispatcher.prepareDispatcherAndWrapRequest(FilterDispatcher.java:330)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:390)
    2008-05-19 16:20 | muboy

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    文件名中有中文該怎么處理?
    2008-05-20 10:53 | 小哥

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    to muboy
    struts2的上傳需要一些jar文件,如common-fileupload.jar,不知你加到classpath里沒(méi)
    2008-05-20 11:44 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    如果文件中有中文名,只要服務(wù)端能成功獲得中文文件名,就可以直接保存,關(guān)鍵是在服務(wù)端能否獲得中文文件名
    2008-05-20 11:46 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    commons-fileupload-1.1.1.jar
    commons-io-1.1.jar

    我添加了這2個(gè)jar文件就可以了,謝謝!
    2008-05-20 13:21 | muboy

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    頁(yè)面用gb2312
    傳到服務(wù)器用8859這些方式我都試了,還是亂碼,你哪里有好辦法嗎?
    2008-05-20 13:22 | 小哥

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    to 小哥
    我再試一下,
    2008-05-20 15:27 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    上傳多個(gè)文件,為什么只能上傳第一個(gè)文件呀。。而且三個(gè)文件名都成了一個(gè)文件名了。
    2008-05-22 16:38 | sdlvzg

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    那是因?yàn)樽詈笠粋€(gè)文件將前兩個(gè)文件覆蓋了,你需要為每一個(gè)文件起不同的名子。
    2008-05-22 17:24 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件[未登錄](méi)  回復(fù)  更多評(píng)論   

    上傳多個(gè)文件的 uploads 怎么獲得的值.
    2008-06-27 15:22 | east

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    文章的代碼里有啊,如果是多個(gè)文件,將每個(gè)文件作為一個(gè)java.io.File對(duì)象保存在List中,實(shí)際上,每一個(gè)File對(duì)象就是一個(gè)已經(jīng)上傳到服務(wù)器的臨時(shí)文件了。

    public class UploadMoreAction extends ActionSupport
    {
    private java.util.List<File> uploads;
    ...
    }
    2008-06-27 17:31 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件[未登錄](méi)  回復(fù)  更多評(píng)論   

    頁(yè)面上 <input type='file' name='upload' />
    應(yīng)該是 <input type='file' name='uploads' />


    2008-06-30 10:16 | east

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    是upload沒(méi)錯(cuò)
    2008-06-30 10:27 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    謝謝啦,成功了。樓主寫(xiě)得真好。。
    2008-11-01 16:40 | daoyongyu

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    怎么缺了這么jar呢?還是什么原因?反正放進(jìn)去是好使了,呵呵
    commons-fileupload-1.2.1.jar
    commons-io-1.4.jar
    需要的可以給我email
    hanjiyuan@gmail.com
    2009-02-11 16:33 | 這是一個(gè)好教程

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    @這是一個(gè)好教程
    這兩個(gè)jar可以到www.apache.org上的commons子項(xiàng)目上下載。這兩個(gè)文件是必須的。
    2009-02-11 16:50 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    請(qǐng)問(wèn)一下.在Action中uploadFileName和uploadContentType為什么是空的沒(méi)值.
    2009-03-11 13:09 | love_future

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    @love_future
    不知你的頁(yè)同是如何寫(xiě)的 <s:file>標(biāo)簽的name屬性值應(yīng)為upload
    2009-03-11 13:55 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    請(qǐng)問(wèn)一下,成員變量fileName是不是應(yīng)該是uploadFileName,否則取不到文件名,fileName為null。
    2009-04-24 12:25 | lvzhu

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    @lvzhu
    對(duì)
    2009-04-24 13:07 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    嗯,不錯(cuò)啊
    2009-07-31 07:58 | jadmin

    # re: Struts2教程7:上傳任意多個(gè)文件[未登錄](méi)  回復(fù)  更多評(píng)論   

    不能上傳大一點(diǎn)的文件,報(bào)錯(cuò)如下
    ,這個(gè)怎么解決
    the request was rejected because its size (2457472) exceeds the configured maximum (2097152)
    2009-08-02 22:08 | 星星

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    默認(rèn)最大是2M
    2009-08-02 22:18 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    需要進(jìn)行設(shè)置
    2009-08-02 22:19 | 銀河使者

    # re: Struts2教程7:上傳任意多個(gè)文件[未登錄](méi)  回復(fù)  更多評(píng)論   

    哦,呵呵,謝謝,加里一句struts.multipart.maxSize=1000000000 就可以了,
    2009-08-02 22:33 | 星星

    # re: Struts2教程7:上傳任意多個(gè)文件[未登錄](méi)  回復(fù)  更多評(píng)論   

    public String uploadFile() throws Exception{
    for (int i = 0; i < file.size(); ++i)
    {
    InputStream is = new FileInputStream(file.get(i));

    String root = ServletActionContext.getServletContext().getRealPath("\\upload");

    File destFile = new File(root, this.getFileFileName().get(i));

    OutputStream os = new FileOutputStream(destFile);

    byte[] buffer = new byte[400];

    int length = 0;

    while ((length = is.read(buffer)) > 0)
    {
    os.write(buffer, 0, length);
    }

    is.close();

    os.close();
    }


    return Action.SUCCESS;
    }
    2009-09-21 11:26 | 獵人

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    暈。不用配置struts2的配置文件嗎
    2010-01-20 15:28 | 夜來(lái)瘋

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    The server encountered an internal error () that prevented it from fulfilling this request

    你們說(shuō)的包我也加進(jìn)去的 但就是不行 。。。。。。
    upload.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
    <form action="upload.action" method="post">
    <input name="upload" type="file">
    <input name="submit" type="submit" value="upload">
    </form>

    UploadAction
    package upload;

    import java.io.*;
    import com.opensymphony.xwork2.ActionSupport;

    public class UploadAction extends ActionSupport
    {
    private File upload;
    private String uploadFileName;
    private String uploadContentType;

    public String getUploadFileName()
    {
    return uploadFileName;
    }

    public void setUploadFileName(String fileName)
    {
    this.uploadFileName = fileName;
    }

    public File getUpload()
    {
    return upload;
    }

    public void setUpload(File upload)
    {
    this.upload = upload;
    }
    public void setUploadContentType(String contentType)
    {
    this.uploadContentType=contentType;

    }

    public String getUploadContentType()
    {
    return this.uploadContentType;
    }
    public String execute() throws Exception
    {
    java.io.InputStream is = new java.io.FileInputStream(upload);
    java.io.OutputStream os = new java.io.FileOutputStream("d:\\upload\\" + uploadFileName);
    byte buffer[] = new byte[8192];
    int count = 0;
    while((count = is.read(buffer)) > 0)
    {
    os.write(buffer, 0, count);
    }
    os.close();
    is.close();
    return "ok";
    }
    }

    struts.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
    <struts>
    <package name="struts2.0" extends="struts-default">
    <action name="login" class="com.LoginAction">
    <result name="input">/login.jsp</result>
    <result name="success">/result.jsp</result>
    <result name="filter">login.jsp</result>
    </action>
    <action name="upload" class="upload.UploadAction">
    <result name="ok">/ok.jsp</result>
    </action>
    </package>
    </struts>
    2010-07-15 11:56 | str

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    <input type='file' name='upload' /> 的話 action 中 if (uploads != null) 進(jìn)不去啊
    2010-08-09 17:35 | waich

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    暈死~~調(diào)了N長(zhǎng)時(shí)間。。。lz的UploadMoreAction 代碼其中一段應(yīng)該如下:
    public java.util.List<String> getUploadsFileName()
    {
    return uploadsFileNames;
    }
    public void setUploadsFileName(java.util.List<String> fileNames)
    {
    this.uploadsFileNames = fileNames;
    }
    最要命的是把setUploadsFileName寫(xiě)成setUploadFileName。。。額的神那最后才發(fā)現(xiàn)
    2011-02-22 22:21 | kirea

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    頁(yè)面上到底應(yīng)該是 <input type='file' name='upload' /> 還是
    <input type='file' name='uploads' /> ?我用'upload'時(shí)上傳多個(gè)文件在UploadMoreAction的execute()中uploads=null,所以我改用'uploads',但是上傳時(shí)又報(bào)以下錯(cuò)誤,怎么回事???

    HTTP Status 500 -

    --------------------------------------------------------------------------------

    type Exception report

    message

    description The server encountered an internal error () that prevented it from fulfilling this request.

    exception

    java.lang.NullPointerException
    action.UploadMoreAction.execute(UploadMoreAction.java:50)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:314)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:142)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:166)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)


    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs.

    2011-05-06 14:53 | 阿侃

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    struts2 的配置文件怎么寫(xiě)啊, 或 web.xml 中,需要寫(xiě)什么呢?
    2011-05-18 23:16 | 愛(ài)好者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    @愛(ài)好者
    <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    2011-06-29 17:35 | 愛(ài)好者

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    老師有個(gè)地方你寫(xiě)錯(cuò)了:
    <input type='file' name='upload' />應(yīng)該是
    <input type='file' name='uploads' />
    因?yàn)樵赼ction中的定義是
    private java.util.List<File> uploads;
    2011-08-14 22:58 | amenmen

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    上傳任意多個(gè)文件保存到數(shù)據(jù)庫(kù)中怎么做(oracle數(shù)據(jù)庫(kù),blob類型)
    2013-12-16 14:16 | sxx

    # 單個(gè)文件上傳錯(cuò)誤  回復(fù)  更多評(píng)論   

    我jsp頁(yè)面選擇文件后獲得的是真實(shí)文件路徑。但是提交到后臺(tái)就是
    java.io.InputStream is = new java.io.FileInputStream(upload);第一句話提示錯(cuò)誤
    java.io.FileNotFoundException: D:\tomcat7.0\work\Catalina\localhost\wyxfweb\upload_5931d1d4_1510eceb59e__8000_00000000.tmp (???????????)
    2015-11-16 13:44 | 趙仁培

    # re: Struts2教程7:上傳任意多個(gè)文件  回復(fù)  更多評(píng)論   

    多個(gè)文件上傳成功 如何在成功頁(yè)面顯示已上傳的文件名字??
    2016-08-11 22:49 |
    主站蜘蛛池模板: 色婷五月综激情亚洲综合| 中文字幕第一页亚洲| 亚洲天堂一区在线| 老汉精品免费AV在线播放| 亚洲JLZZJLZZ少妇| 国产精品无码免费播放| 亚洲一区二区三区不卡在线播放| 亚洲大尺度无码无码专线一区 | 一区二区三区在线免费| 亚洲成AV人网址| 久久亚洲精品无码AV红樱桃| 免费黄色电影在线观看| 亚洲国产精品久久久久| 久久久久久精品免费免费自慰| 亚洲日韩乱码久久久久久| 日本XXX黄区免费看| 亚洲色最新高清av网站| 全部免费a级毛片| 国产免费一级高清淫曰本片| 久久香蕉国产线看观看亚洲片| 91久久青青草原线免费| 亚洲精品无码99在线观看| 国产精品无码永久免费888| 久久99国产亚洲精品观看| 亚洲成人免费电影| 亚洲国产精品无码第一区二区三区 | 最近免费中文字幕高清大全| 久久精品国产亚洲AV蜜臀色欲| 日韩伦理片电影在线免费观看| 国产伦精品一区二区免费| 亚洲美免无码中文字幕在线| 久久久久久久久久免免费精品| 亚洲国产无套无码av电影| 曰批全过程免费视频在线观看| 黄色a三级免费看| 亚洲欧洲国产精品你懂的| 精品久久久久久久免费人妻| 久久久久久久久久久免费精品| 亚洲欧洲国产综合| 亚洲视频在线免费| 无码乱肉视频免费大全合集|