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

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

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

    隨筆-34  評論-1965  文章-0  trackbacks-0

    前一陣子有些朋友在電子郵件中問關于Struts 2實現文件上傳的問題, 所以今天我們就來討論一下這個問題。

    實現原理

    Struts 2是通過Commons FileUpload文件上傳。Commons FileUpload通過將HTTP的數據保存到臨時文件夾,然后Struts使用fileUpload攔截器將文件綁定到Action的實例中。從而我們就能夠以本地文件方式的操作瀏覽器上傳的文件。

    具體實現

    前段時間Apache發布了Struts 2.0.6 GA,所以本文的實現是以該版本的Struts作為框架的。以下是例子所依賴類包的列表:

    依賴類包的列表?
    清單1 依賴類包的列表

    首先,創建文件上傳頁面FileUpload.jsp,內容如下:

    <% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %>
    <% @ taglib prefix = " s " uri = " /struts-tags " %>

    <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
    < html xmlns ="http://www.w3.org/1999/xhtml" >
    < head >
    ? ?
    < title > Struts 2 File Upload </ title >
    </ head >
    < body >
    ? ?
    < s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data" >
    ? ? ? ?
    < s:file name ="myFile" label ="Image File" />
    ? ? ? ?
    < s:textfield name ="caption" label ="Caption" /> ? ? ? ?
    ? ? ? ?
    < s:submit />
    ? ?
    </ s:form >
    </ body >
    </ html >
    清單2 FileUpload.jsp

    在FileUpload.jsp中,先將表單的提交方式設為POST,然后將enctype設為multipart/form-data,這并沒有什么特別之處。接下來,<s:file/>標志將文件上傳控件綁定到Action的myFile屬性。

    其次是FileUploadAction.java代碼:

    package tutorial;

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Date;

    import org.apache.struts2.ServletActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    public class FileUploadAction extends ActionSupport {
    ? ?
    private static final long serialVersionUID = 572146812454l ;
    ? ?
    private static final int BUFFER_SIZE = 16 * 1024 ;
    ? ?
    ? ?
    private File myFile;
    ? ?
    private String contentType;
    ? ?
    private String fileName;
    ? ?
    private String imageFileName;
    ? ?
    private String caption;
    ? ?
    ? ?
    public void setMyFileContentType(String contentType) {
    ? ? ? ?
    this .contentType = contentType;
    ? ?}

    ? ?
    ? ?
    public void setMyFileFileName(String fileName) {
    ? ? ? ?
    this .fileName = fileName;
    ? ?}

    ? ? ? ?
    ? ?
    public void setMyFile(File myFile) {
    ? ? ? ?
    this .myFile = myFile;
    ? ?}

    ? ?
    ? ?
    public String getImageFileName() {
    ? ? ? ?
    return imageFileName;
    ? ?}

    ? ?
    ? ?
    public String getCaption() {
    ? ? ? ?
    return caption;
    ? ?}


    ? ?
    public void setCaption(String caption) {
    ? ? ? ?
    this .caption = caption;
    ? ?}

    ? ?
    ? ?
    private static void copy(File src, File dst) {
    ? ? ? ?
    try {
    ? ? ? ? ? ?InputStream in
    = null ;
    ? ? ? ? ? ?OutputStream out
    = null ;
    ? ? ? ? ? ?
    try { ? ? ? ? ? ? ? ?
    ? ? ? ? ? ? ? ?in
    = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
    ? ? ? ? ? ? ? ?out
    = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
    ? ? ? ? ? ? ? ?
    byte [] buffer = new byte [BUFFER_SIZE];
    ? ? ? ? ? ? ? ?
    while (in.read(buffer) > 0 ) {
    ? ? ? ? ? ? ? ? ? ?out.write(buffer);
    ? ? ? ? ? ? ? ?}

    ? ? ? ? ? ?}
    finally {
    ? ? ? ? ? ? ? ?
    if ( null != in) {
    ? ? ? ? ? ? ? ? ? ?in.close();
    ? ? ? ? ? ? ? ?}

    ? ? ? ? ? ? ? ?
    if ( null != out) {
    ? ? ? ? ? ? ? ? ? ?out.close();
    ? ? ? ? ? ? ? ?}

    ? ? ? ? ? ?}

    ? ? ? ?}
    catch (Exception e) {
    ? ? ? ? ? ?e.printStackTrace();
    ? ? ? ?}

    ? ?}

    ? ?
    ? ?
    private static String getExtention(String fileName) {
    ? ? ? ?
    int pos = fileName.lastIndexOf( " . " );
    ? ? ? ?
    return fileName.substring(pos);
    ? ?}


    ? ?@Override
    ? ?
    public String execute() ? ? { ? ? ? ?
    ? ? ? ?imageFileName
    = new Date().getTime() + getExtention(fileName);
    ? ? ? ?File imageFile
    = new File(ServletActionContext.getServletContext().getRealPath( " /UploadImages " ) + " / " + imageFileName);
    ? ? ? ?copy(myFile, imageFile);
    ? ? ? ?
    return SUCCESS;
    ? ?}

    ? ?
    }
    清單3 tutorial/FileUploadAction.java

    在FileUploadAction中我分別寫了setMyFileContentType、setMyFileFileName、setMyFile和setCaption四個Setter方法,后兩者很容易明白,分別對應FileUpload.jsp中的<s:file/>和<s:textfield/>標志。但是前兩者并沒有顯式地與任何的頁面標志綁定,那么它們的值又是從何而來的呢?其實,<s:file/>標志不僅僅是綁定到myFile,還有myFileContentType(上傳文件的MIME類型)和myFileFileName(上傳文件的文件名,該文件名不包括文件的路徑)。因此,<s:file name="xxx" />對應Action類里面的xxx、xxxContentType和xxxFileName三個屬性。

    FileUploadAction作用是將瀏覽器上傳的文件拷貝到WEB應用程序的UploadImages文件夾下,新文件的名稱是由系統時間與上傳文件的后綴組成,該名稱將被賦給imageFileName屬性,以便上傳成功的跳轉頁面使用。

    下面我們就來看看上傳成功的頁面:

    <% @ page language = " java " contentType = " text/html; charset=utf-8 " pageEncoding = " utf-8 " %>
    <% @ taglib prefix = " s " uri = " /struts-tags " %>

    <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
    < html xmlns ="http://www.w3.org/1999/xhtml" >
    < head >
    ? ?
    < title > Struts 2 File Upload </ title >
    </ head >
    < body >
    ? ?
    < div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" >
    ? ? ? ?
    < img src ='UploadImages/<s:property value ="imageFileName" /> ' />
    ? ? ? ?
    < br />
    ? ? ? ?
    < s:property value ="caption" />
    ? ?
    </ div >
    </ body >
    </ html >
    清單4 ShowUpload.jsp

    ShowUpload.jsp獲得imageFileName,將其UploadImages組成URL,從而將上傳的圖像顯示出來。

    然后是Action的配置文件:

    <? 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 ="fileUploadDemo" extends ="struts-default" >
    ? ? ? ?
    < action name ="fileUpload" class ="tutorial.FileUploadAction" >
    ? ? ? ? ? ?
    < interceptor-ref name ="fileUploadStack" />
    ? ? ? ? ? ?
    < result name ="success" > /ShowUpload.jsp </ result >
    ? ? ? ?
    </ action >
    ? ?
    </ package >
    </ struts >
    清單5 struts.xml

    fileUpload Action顯式地應用fileUploadStack的攔截器。

    最后是web.xml配置文件:

    <? xml version="1.0" encoding="UTF-8" ?>
    < web-app id ="WebApp_9" version ="2.4"
    ? ? xmlns
    ="http://java.sun.com/xml/ns/j2ee"
    ? ? xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
    ? ? xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

    ? ?
    < display-name > Struts 2 Fileupload </ display-name >

    ? ?
    < filter >
    ? ? ? ?
    < filter-name > struts-cleanup </ filter-name >
    ? ? ? ?
    < filter-class >
    ? ? ? ? ? ? org.apache.struts2.dispatcher.ActionContextCleanUp
    ? ? ? ?
    </ filter-class >
    ? ?
    </ filter >
    ? ??
    ? ?
    < filter >
    ? ? ? ?
    < filter-name > struts2 </ filter-name >
    ? ? ? ?
    < filter-class >
    ? ? ? ? ? ? org.apache.struts2.dispatcher.FilterDispatcher
    ? ? ? ?
    </ filter-class >
    ? ?
    </ filter >
    ? ??
    ? ?
    < filter-mapping >
    ? ? ? ?
    < filter-name > struts-cleanup </ filter-name >
    ? ? ? ?
    < url-pattern > /* </ url-pattern >
    ? ?
    </ filter-mapping >

    ? ?
    < filter-mapping >
    ? ? ? ?
    < filter-name > struts2 </ filter-name >
    ? ? ? ?
    < url-pattern > /* </ url-pattern >
    ? ?
    </ filter-mapping >

    ? ?
    < welcome-file-list >
    ? ? ? ?
    < welcome-file > index.html </ welcome-file >
    ? ?
    </ welcome-file-list >

    </ web-app >
    清單6 WEB-INF/web.xml

    發布運行應用程序,在瀏覽器地址欄中鍵入:http://localhost:8080/Struts2_Fileupload/FileUpload.jsp,出現圖示頁面:


    清單7 FileUpload頁面

    選擇圖片文件,填寫Caption并按下Submit按鈕提交,出現圖示頁面:


    清單8 上傳成功頁面

    更多配置

    在運行上述例子,如果您留心一點的話,應該會發現服務器控制臺有如下輸出:

    Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.dispatcher.Dispatcher getSaveDir
    INFO: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
    Mar
    20 , 2007 4 : 08 : 43 PM org.apache.struts2.interceptor.FileUploadInterceptor intercept
    INFO: Removing file myFile C:\Program Files\Tomcat
    5.5 \work\Catalina\localhost\Struts2_Fileupload\upload_251447c2_1116e355841__7ff7_00000006.tmp
    清單9 服務器控制臺輸出

    上述信息告訴我們,struts.multipart.saveDir沒有配置。struts.multipart.saveDir用于指定存放臨時文件的文件夾,該配置寫在struts.properties文件中。例如,如果在struts.properties文件加入如下代碼:

    struts.multipart.saveDir = /tmp
    清單10 struts配置

    這樣上傳的文件就會臨時保存到你根目錄下的tmp文件夾中(一般為c:\tmp),如果此文件夾不存在,Struts 2會自動創建一個。

    錯誤處理

    上述例子實現的圖片上傳的功能,所以應該阻止用戶上傳非圖片類型的文件。在Struts 2中如何實現這點呢?其實這也很簡單,對上述例子作如下修改即可。

    首先修改FileUpload.jsp,在<body>與<s:form>之間加入“<s:fielderror />”,用于在頁面上輸出錯誤信息。

    然后修改struts.xml文件,將Action fileUpload的定義改為如下所示:

    ? ? ? ? < action name ="fileUpload" class ="tutorial.FileUploadAction" >
    ? ? ? ? ? ?
    < interceptor-ref name ="fileUpload" >
    ? ? ? ? ? ? ? ?
    < param name ="allowedTypes" >
    ? ? ? ? ? ? ? ? ? ? image/bmp,image/png,image/gif,image/jpeg
    ? ? ? ? ? ? ? ?
    </ param >
    ? ? ? ? ? ?
    </ interceptor-ref >
    ? ? ? ? ? ?
    < interceptor-ref name ="defaultStack" /> ? ? ? ? ? ?
    ? ? ? ? ? ?
    < result name ="input" > /FileUpload.jsp </ result >
    ? ? ? ? ? ?
    < result name ="success" > /ShowUpload.jsp </ result >
    ? ? ? ?
    </ action >
    清單11 修改后的配置文件

    顯而易見,起作用就是fileUpload攔截器的allowTypes參數。另外,配置還引入defaultStack它會幫我們添加驗證等功能,所以在出錯之后會跳轉到名稱為“input”的結果,也即是FileUpload.jsp。

    發布運行應用程序,出錯時,頁面如下圖所示:


    清單12 出錯提示頁面

    上面的出錯提示是Struts 2默認的,大多數情況下,我們都需要自定義和國際化這些信息。通過在全局的國際資源文件中加入“struts.messages.error.content.type.not.allowed=The file you uploaded is not a image”,可以實現以上提及的需求。對此有疑問的朋友可以參考我之前的文章《在Struts 2.0中國際化(i18n)您的應用程序》。

    實現之后的出錯頁面如下圖所示:


    清單13 自定義出錯提示頁面

    同樣的做法,你可以使用參數“maximumSize”來限制上傳文件的大小,它對應的字符資源名為:“struts.messages.error.file.too.large”。

    字符資源“struts.messages.error.uploading”用提示一般的上傳出錯信息。

    多文件上傳

    與單文件上傳相似,Struts 2實現多文件上傳也很簡單。你可以將多個<s:file />綁定Action的數組或列表。如下例所示。

    < s:form action ="doMultipleUploadUsingList" method ="POST" enctype ="multipart/form-data" >
    ? ?
    < s:file label ="File (1)" name ="upload" />
    ? ?
    < s:file label ="File (2)" name ="upload" />
    ? ?
    < s:file label ="FIle (3)" name ="upload" />
    ? ?
    < s:submit />
    </ s:form >
    清單14 多文件上傳JSP代碼片段

    如果你希望綁定到數組,Action的代碼應類似:

    ? ? private File[] uploads;
    ? ?
    private String[] uploadFileNames;
    ? ?
    private String[] uploadContentTypes;

    ? ?
    public File[] getUpload() { return this .uploads; }
    ? ?
    public void setUpload(File[] upload) { this .uploads = upload; }

    ? ?
    public String[] getUploadFileName() { return this .uploadFileNames; }
    ? ?
    public void setUploadFileName(String[] uploadFileName) { this .uploadFileNames = uploadFileName; }

    ? ?
    public String[] getUploadContentType() { return this .uploadContentTypes; }
    ? ?
    public void setUploadContentType(String[] uploadContentType) { this .uploadContentTypes = uploadContentType; }
    清單15 多文件上傳數組綁定Action代碼片段

    如果你想綁定到列表,則應類似:

    ? ? private List < File > uploads = new ArrayList < File > ();
    ? ?
    private List < String > uploadFileNames = new ArrayList < String > ();
    ? ?
    private List < String > uploadContentTypes = new ArrayList < String > ();

    ? ?
    public List < File > getUpload() {
    ? ? ? ?
    return this .uploads;
    ? ?}

    ? ?
    public void setUpload(List < File > uploads) {
    ? ? ? ?
    this .uploads = uploads;
    ? ?}


    ? ?
    public List < String > getUploadFileName() {
    ? ? ? ?
    return this .uploadFileNames;
    ? ?}

    ? ?
    public void setUploadFileName(List < String > uploadFileNames) {
    ? ? ? ?
    this .uploadFileNames = uploadFileNames;
    ? ?}


    ? ?
    public List < String > getUploadContentType() {
    ? ? ? ?
    return this .uploadContentTypes;
    ? ?}

    ? ?
    public void setUploadContentType(List < String > contentTypes) {
    ? ? ? ?
    this .uploadContentTypes = contentTypes;
    ? ?}
    清單16 多文件上傳列表綁定Action代碼片段

    總結

    在Struts 2中實現文件上傳的確是輕而易舉,您要做的只是使用<s:file />與Action的屬性綁定。這又一次有力地證明了Struts 2的簡單易用。

    posted on 2007-03-21 00:48 Max 閱讀(108646) 評論(148)  編輯  收藏 所屬分類: Struts 2.0系列
    評論共2頁: 1 2 下一頁 

    評論:
    # re: 在Struts 2中實現文件上傳 2007-08-29 13:50 | Ouch
    好像還應該加入包servlet-api.jar !!!  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-03 16:58 | li
    好像filename取出來的是null呀,有人碰到這種情況嗎?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2007-09-04 09:40 | Mike
    我取出來的filename也是null啊,到底怎么搞的,有些地方沒有講清楚  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-04 16:13 | tf
    我取出的也是null,
    運行出現下面的錯誤提示,也就是值都沒有傳過去.請高手指教
    type Exception report

    message

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

    exception

    java.lang.NullPointerException
    tutorial.FileUpload.getExtention(FileUpload.java:76)
    tutorial.FileUpload.execute(FileUpload.java:82)
    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:585)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:334)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:221)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:195)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:118)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.intercept(PrepareInterceptor.java:115)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:155)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:180)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:204)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    org.apache.struts2.impl.StrutsActionProxy$1.call(StrutsActionProxy.java:25)
    org.apache.struts2.impl.StrutsActionProxy$1.call(StrutsActionProxy.java:24)
    org.apache.struts2.impl.RequestContextImpl.callInContext(RequestContextImpl.java:147)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:23)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:317)
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:242)

      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-04 17:03 | tf
    怎么沒有人回答?請高手指教  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-05 00:35 | Max
    @Mike
    @tf
    請細心對照我文中的步驟去做,結果應該會出來的。
    或者你的WEB-INF/web.xml的內容,是否有加入:
    < filter >
    < filter-name > struts2 </ filter-name >
    < filter-class >
    org.apache.struts2.dispatcher.FilterDispatcher
    </ filter-class >
    </ filter >  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2007-09-07 15:59 | Mike
    @li
    @tf
    我想我大概知道錯誤的原因了,你們可能是漏了一些get/set方法,或者是自己在struts.xml中加入了<interceptor name ="fileUploadStack" class ="tutorial.FileUploadInterceptor" />,這個不需要自己加入的,是struts2內置的interceptor,會自動調用。我希望我的解決方法可以對你們有用,這里也要對max說聲對不起了,沒有跑出來是自己沒按照規則來做。  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-10 16:59 | tf
    請問Max可以出個和文件上傳對應的文件下載的例子嗎?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-10 17:09 | tf
    誰有和文件下載的的例子的麻煩發到我郵箱好嗎?
    我的郵箱是susu_zi@126.com  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-12 15:53 | shenchong
    Max,請問一下為什么我在做多附件上傳的時候uploads里面的內容是String型的,而不是File類型的  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-13 00:19 | Max
    @tf
    Struts 2 的Show Case中有相關的例子
    @shenchong
    你看錯了吧?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-13 11:04 | laibin
    學習中!
    在此感謝Max!  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-13 17:46 | shenchong
    @Max
    我沒有看錯的,我試過了show case中的相關例子,它拿到的的確是List類型的,但我拿到的卻是String的,是不是還需要在哪里配置?或者是jar包的版本問題?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-14 09:53 | ILOVEYOU

    @Max
    我現在出現如下異常,圖片顯示不出來

    java.io.FileNotFoundException: D:\Java\jetty-6.1.3\webapps\uploadtest\UploadImages\1189733933484.bmp (系統找不到指定的路徑。)
     at java.io.FileOutputStream.open(Native Method)
     at java.io.FileOutputStream.
    <init>(FileOutputStream.java:179)
     at java.io.FileOutputStream.
    <init>(FileOutputStream.java:131)
     at tutorial.FileUploadAction.copy(FileUploadAction.java:
    87)
     at tutorial.FileUploadAction.execute(FileUploadAction.java:
    114)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
    39)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
    25)
     at java.lang.reflect.Method.invoke(Method.java:
    585)
     at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:
    404)
     at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:
    267)
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
    229)
     at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:
    123)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:224)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:223)
     at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:
    455)
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
    221)
     at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:
    167)
     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:
    86)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:224)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:223)
     at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:
    455)
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
    221)
     at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:
    83)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:224)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:223)
     at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:
    455)
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
    221)
     at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:
    121)
     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:
    86)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:224)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:223)
     at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:
    455)
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
    221)
     at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:
    170)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:224)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:223)
     at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:
    455)
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
    221)
     at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:
    176)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:224)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:223)
     at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:
    455)
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
    221)
     at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:
    268)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:224)
     at com.opensymphony.xwork2.DefaultActionInvocation$
    2.doProfiling(DefaultActionInvocation.java:223)
     at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:
    455)
     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
    221)
     at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:
    50)
     at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:
    504)
     at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:
    419)
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:
    1089)
     at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:
    99)
     at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:
    1089)
     at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:
    365)
     at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:
    216)
     at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
    181)
     at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
    712)
     at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
    405)
     at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:
    211)
     at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:
    114)
     at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
    139)
     at org.mortbay.jetty.Server.handle(Server.java:
    285)
     at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
    502)
     at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:
    835)
     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:
    641)
     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:
    208)
     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:
    378)
     at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:
    368)
     at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:
    442)
    2007-9-14 9:38:54 org.apache.struts2.interceptor.FileUploadInterceptor intercept
    信息: Removing file myFile \tmp\upload_4b5952e6_11501ab2110__8000_00000000.tmp


    大家幫我看看

      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-09-14 22:34 | leson
    提醒一下,MAX示例代碼中拷貝文件部分:
    in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
    out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
    byte [] buffer = new byte [BUFFER_SIZE];
    while (in.read(buffer) > 0 ) {
    out.write(buffer);
    }

    有點問題,如果文件的大小,%BUFFERSIZE的余數不為0,則會造成多拷貝了N多K字節,又加之buffer[]里面剩余部分沒有被覆蓋,導致最后的文件和原來的文件前面部分相等,后面的部分就沒有多少規律了,但卻又不是全空。

    修正方法是:
    byte[] buffer = new byte[BUFFER_SIZE];
    for (int byteRead = 0; (byteRead = in.read(buffer)) > 0; )
    {
    out.write(buffer, 0, byteRead);
    }
    最后一次寫入該寫的字節就可以了。
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2007-09-26 22:14 | Jimmy
    文件類型里明明有jpeg,png的,為什么不能上傳?
    Content-Type not allowed: myFile "upload_3eb7e010_115421d641d__8000_00000032.tmp" image/pjpeg

    Content-Type not allowed: myFile "upload_3eb7e010_115421d641d__8000_00000034.tmp" image/x-png  回復  更多評論
      
    # 遇到了同樣的問題 2007-10-09 12:00 | referee
    上面有人出現的問題我也遇到了,搞不來,哪位高人幫幫忙
    java.io.FileNotFoundException: F:\cvs_root\struts\WebContent\UploadImages\1191902350707.bmp (系統找不到指定的路徑。)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at tutorial.FileUploadAction.copy(FileUploadAction.java:55)
    at tutorial.FileUploadAction.execute(FileUploadAction.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:334)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:221)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:195)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:118)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.intercept(PrepareInterceptor.java:115)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:155)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:180)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:266)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:193)
    at org.apache.struts2.impl.StrutsActionProxy$1.call(StrutsActionProxy.java:25)
    at org.apache.struts2.impl.StrutsActionProxy$1.call(StrutsActionProxy.java:24)
    at org.apache.struts2.impl.RequestContextImpl.callInContext(RequestContextImpl.java:147)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:23)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:317)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:242)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Unknown Source)
    2007-10-9 11:59:10 org.apache.struts2.interceptor.FileUploadInterceptor intercept
    信息: Removing file myFile \tmp\upload__7d878dc9_11582e8d4f6__8000_00000002.tmp  回復  更多評論
      
    # 知道答案了 2007-10-09 12:43 | referee
    是文件夾要手動建立  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2007-10-10 12:42 | hehe
    不錯,什么時候來個struts2+hibernate+spring整合,期待中。。。。。。。。  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-10-31 16:57 | 赫連紫軒(puras)
    Struts2.0的上傳文件大小默認是2M
    可以通過在struts.xml里來修改這個大小
    <constant name="struts.multipart.maxSize" value="5242880" />

    但是遇到個問題就是
    這里假如我設置的是5M
    而我的Action實上設置的為3M
    此時我上傳4M的文件的時候
    可以捕捉到異常提示我文件過大
    返回到上傳頁面
    如果此時我上傳的文件超過了5M
    則會直接告訴我文件過大
    雖然也會返回到上傳頁面
    但之前上傳頁面的數據將會丟失
    比如說從別的頁面傳遞過來的一些參數.

    請教下該如何解決?
    謝謝.  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-11-01 10:27 | 游客
    max你好,我一直關注著你的struts2,從開始接觸struts2就是看的你的博客,受益匪淺,非常感謝你的介紹,現在網上關于struts的內容太少了。你說的批量上傳文件,他的文件名里有系統時間,那同一次上傳的文件,系統時間是一樣的嗎  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-11-23 11:07 | kayata
    @游客
    遇到一個問題,struts2和spring2集成后,在文件上傳時,發現fileload攔截器不工作,設置的文件類型和大小都不起作用,不知為什么?,急  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-11-26 09:35 | @游客
    點擊文件上傳時提示Invalid field value for field "myFile",你的myFile字段時File型,我把他改成String型就可以,然后做相應的修改,請問這到底時為何  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-11-29 09:16 | bolly
    我在上傳的action中加了攔截器以后,別的action請求也被攔截下來了,fileUpload是全局的嗎?怎么解決?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-11-29 09:37 | bolly
    <action name="dofileUpload" class="fileUploadAction"
    method="dofileUpload">
    <interceptor-ref name="fileUpload">
    <param name="allowedTypes">
    application/vnd.ms-excel,text/plain
    </param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <result name="input">WEB-INF/jsp/zzz/upload.jsp</result>
    <result>WEB-INF/jsp/zzz/upload.jsp</result>
    </action>
    <action name="uploadClear" class="fileUploadAction"
    method="uploadClear">
    <result name="input">WEB-INF/jsp/zzz/upload.jsp</result>
    <result>WEB-INF/jsp/zzz/upload.jsp</result>
    </action>
    uploadClear提交不到action中去,怎么會這樣?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-11-29 10:15 | zoninge
    大家幫我看看這個錯誤啊,包已經添進去了,怎么回事呢?

    HTTP Status 404 - /photo/fileUpload

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

    type Status report

    message /photo/fileUpload

    description The requested resource (/photo/fileUpload) is not available.


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

    Apache Tomcat/5.5.15  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-11-29 17:38 | zoninge
    終于出來了
    相當感謝啊
    我是小菜鳥 多多指教!  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-12-22 09:59 | xtmtd
    上傳一個大文件時,STRUTS2的攔截器,會報錯,說文件過大。但是一次上傳幾個大文件時,STRUTS2的攔截器就不報任何錯誤了,也沒有提示,不知道為什么啊?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2007-12-26 10:14 | suyuan
    啊 我也出現了這個問題

    type Exception report

    message

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

    exception

    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)
    org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)

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

    filter 也配了 上傳出現這個,。。。。  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2007-12-29 10:20 | wendy
    這么寫會存在并發問題吧?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2007-12-29 21:56 | wendy
    當我上傳一個空文件時(比如說我建一個 新建文件.txt),報空指針異常,我覺得只要文件存在不管里面有沒有內容都不應該報錯的啊,為什么?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-01-04 18:03 | ElgooG
    寫的東西不完全對啊  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-01-09 20:15 | szz
    我想問一下,我的form中加了enctype="multipart/form-data",配了struts2的校驗器校驗其他的文本框就不起作用了,去了enctype="multipart/form-data",校驗器就好用了,這是怎么回事呀?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-01-22 01:01 | 飛飛
    當我配置web.xml后,網站目錄不能瀏覽,出現404錯誤!
    請問這是什么問題?
    謝謝.  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-02-20 16:11 | walkerstar
    Struts2的文件上傳只能說是簡單的文件上傳。
    如果一個網站文件上傳很重要的話,需要仔細的考慮各種可能性。
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-02-22 13:10 | look
    我無法通過攔截器控制上傳類型,代碼在下面,有誰能幫我看看,我試了很久fileUploadStack這個攔截器就是不起作用,什么文件都能上傳。
    struts.xml:
    <include file ="struts-default.xml" />
    <action name="fileUpload" class="struts.FileUpLoad">
    <interceptor-ref name ="fileUploadStack" >
    <param name ="allowedTypes" >
    image/bmp,image/png,image/gif,image/jpeg
    </param >
    </interceptor-ref >
    <interceptor-ref name ="defaultStack" /> <result name ="input" >/upload.jsp</result >
    <result name="success">/show.jsp</result>

    upload.jsp:
    <s:fielderror></s:fielderror>
    <s:form action="fileUpload" method="post" enctype="multipart/form-data">
    <s:file name="myFile" label="file"></s:file>
    <s:textfield name="caption" label ="Caption"></s:textfield>
    <s:submit></s:submit>
    </s:form>
    <hr>
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-03-13 21:50 | kisssa
    @babala

    要傳.jpg格式的圖片,應該是image/pjpeg。
    我也不知道為什么,但我按照錯誤提示,修改后就OK了,希望對你有用  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-04-03 09:29 | xiaohu
    各位有調通多文件上傳的嗎?多文件上傳時,如何把filename,contentType和頁面的<s:file>綁定呢??  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-04-14 19:53 | 才情亂舞
    如果要上傳到數據庫怎么修改Action和struts.xml配置文件(結合hibernate和spring)  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-04-25 10:21 | re
    <param name ="allowedTypes">
    image/bmp,image/png,image/gif,image/jpeg,text/xml,application/zip
    </param>

    這里這樣寫還是不可以傳xml格式和zip格式的  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-05-12 21:48 | Hathor
    @eddie
    我也打印不出來
    不知道如何修改阻止提交文件的非圖片類型以及
    顯示我友好的錯誤信息  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-05-27 20:27 | cathy
    請問如何更改上傳的路徑啊
    我想要更改成指定路徑啊
    請多多指教啊  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-05-29 06:06 | 123
    321564165  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-06-02 15:23 | loda
    asdasdsadad  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-07-05 11:46 | 愛愛愛
    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-07-08 19:13 | 按時的
    asd   回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-07-24 09:13 | 王仁
    還可以  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-07-24 10:13 | 王仁
    asdfsdfsdf  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-07-24 10:14 | 王仁
    愛不性  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-07-31 15:59 | xiexie
    有完整例子嗎包括LIB。發一份不勝感激cheerzan@yahoo.com.cn  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2008-08-07 13:08 | matrix
    @Max
    我作如下設置:
    struts.xml:
    <param name="maximumSize">102400</param>

    globalMessage_zh_CN.properties:
    struts.messages.error.file.too.large=上傳文件太大!

    strusts.properties:
    struts.multipart.maxSize=1048576

    當上傳的圖片大小Size:102400<Size<1048576時,會提示“上傳文件太大!”,而當Size>1048576時,頁面并不提示,盡管后臺打印出了文件太大的信息。我怎么讓它在頁面也表現出來呢???  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-08-18 11:38 | mzy
    # re: 在Struts 2中實現文件上傳 2007-11-26 09:35 | @游客
    點擊文件上傳時提示Invalid field value for field "myFile",我的也出現了這個問題,但是我解決了,因為我使用的是 普通的FORM ,沒有使用<s:form>標簽,但我的FORM 中,沒有添加 method='post' 屬性,添加后,可以上傳文件了。 希望對其它人有幫助。  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-11-03 21:45 | yihaijian
    為什么我什么都是對的,就是圖片不顯示啊,郁悶,大家幫幫忙啊...  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-11-12 11:18 | 車水馬龍
    @yihaijian
    文件路徑錯誤了吧  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-11-19 10:46 | lrl
    感覺跟你們相見恨晚
    向你們看齊·  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-11-19 10:56 | lrl
    學習struts中,每次程序錯誤,上網都可以找到高人的解答方法,有種相見恨晚感覺,努力向你們看齊  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2008-12-16 10:28 | icewind
    請問,為什么我上傳的struts.xml中設置的所有類型的圖片類型文件,都說是
    The file you uploaded is not a image啊,還有知道的人 ?????  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-01-09 18:08 | 瑞瑞
    想不到吧這位同學,2009年的1月9號我也碰到了和你同樣的問題,弄不出來,我是按照struts2中文幫助文檔做的,什么都沒錯,就是不顯示圖片,郁悶。。。。  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2009-01-11 13:52 | reaijava
    正在學習Struts 2 支持  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-01-19 19:07 | shuzigui
    我運行你的第二個例子的時候,就是限制文件類型時,出錯,我按照你的配置修改struts.xml,在上傳非圖片格式的文件時,仍然可以上傳上去,這是怎么回事呀?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-01-19 19:18 | shuzigui
    @Joe
    你的錯誤是在FileUploadAction.java中getExtention方法下的fileName.lastIndexOf( "." );引號中只有一個點,而不是有有空格加點的(" . ")這種,我今天碰到這種問題,我把它改過來就可以運行第一個例子了  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-02-05 16:39 | sheepzhao
    @zoninge
    你的問題怎么解決的阿?我也出現這個問題了  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-03-17 21:15 | 2少
    File imageFile = new File(ServletActionContext.getServletContext().getRealPath( " /UploadImages " ) + " / " + imageFileName);

    請問一下,這句代碼是用來干什么的呢?


    我在編譯Action的時候,老是說 無法訪問javax.servlet.ServletContext
    然后說上面那一句代碼有錯誤  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-04-27 18:10 | tufu
    剛學struts2,搞此上傳文件例子時有如下錯誤:
    java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]
    懇求高人指點!mrzhangtufu@126.com
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2009-05-29 16:17 | coobee
    @ILOVEYOU

    I encountered the same problem, it's because that the directory "UpdateImages" doesn't exist. Please invoke

    FileUtils.copyFile(myFile, imageFile);

    to replace the original copy method.

    or

    Add the below code in copy method to create the parent directory when it does't exist.

    if (dst.getParentFile() != null && dst.getParentFile().exists() == false) {
    if (dst.getParentFile().mkdirs() == false) {
    throw new IOException("Destination '" + dst + "' directory cannot be created");
    }
    }
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-08-05 14:03 | 第三方
    你能說一下怎么存到數據庫么,發到736732716@qq.com 謝謝  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2009-08-09 12:53 | HAHA
    太感謝 了。   回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2009-08-09 12:53 | HAHA
    thanks   回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-10-12 22:18 | 哥們
    在struts2上傳時,我碰到個問題,想請教
    如果某個文章記錄已經上傳了圖片,而后來發現這個記錄要修改,但不需要重新上傳圖片,只需要修改其它的字段,提交后,發現原來上傳的圖片記錄就沒有了

    為此我還得在頁面另外隱藏一個字段,并且在action里做大段處理代碼。想請問一下你是否碰到過此問題
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2009-11-04 22:38 | zx
    存數據庫里只需要把fileName圖片名存進去i就OK,其實也沒必要存數據庫的圖片的話,放服務器上就行  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2009-11-27 15:08 | zc
    如果我多文件上傳,一個文件只準上傳圖片格式,另外一個沒有限制了,該怎么辦?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2009-12-10 14:38 | wo
    請問下,我照你的全都寫了,在上傳那個頁面不管你上傳什麼都不會跳過去,根本一點跳動都沒有,不知道是什麼原因?有沒高手遇到過?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2009-12-10 14:44 | wo
    @@wo
    我都是一字不漏的全復過來的,就是在上傳那個頁面根本就不跳,,發呆了  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2009-12-11 15:34 | wo
    您好,我想請問下您寫的第一個我試了下報出下面異常:
    imageFileName===1260516248015.jpg
    java.io.FileNotFoundException: D:\Tomcat 6.0\webapps\Struts28\UploadImages (存取被拒。)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
    at tutorial.FileUploadAction.copy(FileUploadAction.java:57)
    at tutorial.FileUploadAction.execute(FileUploadAction.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:306)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    我在路徑下找不到圖片,感覺好像只是得到了圖片名,圖片根本就沒有上傳進去。。。求幫下忙  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳異常 2010-03-08 16:58 | 苗海峰
    2010-3-8 16:48:41 org.apache.struts2.dispatcher.Dispatcher getSaveDir
    信息: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir

    希望大家幫忙一下怎么處理  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2010-03-17 16:50 | zm
    public void setMyFileContentType(String contentType) {
    this .contentType = contentType;
    }

    public void setMyFileFileName(String fileName) {
    this .fileName = fileName;
    }
    這兩個方法名是固定的嗎?為什么?  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2010-03-17 16:58 | zm

    在此先感謝作者的這篇文章。
    上個問題明白了  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2010-07-17 16:27 | LY
    你能跳轉ACTION嗎  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2010-08-22 23:05 | 鳳嵐舞
    @carlos175
    這個問題怎么解決啊,  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2010-11-08 15:47 | 廣州用戶
    @carlos175
    可以用freemarker,struts2默認有擴展了freemarker,它生成的靜態頁也容易給百度,google找到。  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2010-11-19 10:15 | yfjtd
    try {
    in = new BufferedInputStream(new FileInputStream(src),BUFFER_SIZE);
    out = new BufferedOutputStream(new FileOutputStream(dst),BUFFER_SIZE);
    byte[] buffer = new byte[BUFFER_SIZE];
    for (int byteRead = 0; (byteRead = in.read(buffer)) > 0; )
    {
    out.write(buffer, 0, byteRead);
    }
    } finally
    {
    if (null != in)
    {
    in.close();
    }
    if (null != out)
    {
    out.close();
    }
    }
    } catch (Exception e)
    {
    e.printStackTrace();
    }

    BUFFER_SIZE這個地方報錯,不知道咋回事???  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-01-08 11:58 | yupan6
    遇到的問題應該是action中 一些字段里存在的空格引起的問題  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-08-17 09:30 | 櫻花草
    在WebRoot下建立一個UploadImages文件夾試試  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-08-17 09:37 | 櫻花草
    我上傳的文件在tomcat中有 但是不顯示到我在項目中建立的文件夾中怎么回事  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-08-23 14:23 | Blur
    @櫻花草
    這個問題很簡單,你的項目是放在myeclipse的工作空間的,圖片上傳的路徑是服務器的路徑,所以項目上肯定是沒有的,只有tomcat上有圖片  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-08-31 14:09 | 嚴學智
    java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]
    at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:136)
    at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:476)
    at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:486)
    at com.opensymphony.xwork2.inject.ContainerImpl$9.call(ContainerImpl.java:517)
    at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:542)
    at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:515)
    at org.apache.struts2.dispatcher.Dispatcher.wrapRequest(Dispatcher.java:697)
    at org.apache.struts2.dispatcher.FilterDispatcher.prepareDispatcherAndWrapRequest(FilterDispatcher.java:334)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:394)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
    at java.lang.Thread.run(Thread.java:595)
    Caused by: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]
    at org.apache.struts2.config.BeanSelectionProvider$ObjectFactoryDelegateFactory.create(BeanSelectionProvider.java:247)
    at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:134)
    ... 20 more
    求助。。。。  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2011-10-11 23:54 | spring
    缺少common-fileupload.jar@renminyan
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2011-10-11 23:58 | spring
    不要直接把代碼復制過去,仔細檢查一下,會發現有問題的@li
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-10-25 08:57 | zgb
    你好 我是新人 ,希望多多指點,文件上傳到什么地方去了,如果我要把文件上傳到數據庫去 怎么辦????  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-10-25 09:09 | zgb
    @tf
    你看下setMyFileFileName有沒弄錯  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-10-25 09:26 | zgb
    你好 我是新人 ,希望多多指點,文件上傳到什么地方去了,如果我要把文件上傳到數據庫去 怎么辦???? 我的郵箱是zgb6219@163.com 謝謝了。  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-10-31 13:55 | zgb
    @Allen
    你好 說說maximumSize在哪設置30M的大小 啊 謝謝 我一直沒弄出來文件大小的設置  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2011-11-23 14:25 | lkang08
    博主您好,我照您的方法敲了代碼,不過有個問題,就是上傳的文件不是存在web根目錄下的upload文件夾下的,而是存在
    F:\java\2011\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\zxdy\upload
    這里。請問一下這是什么原因呢?該怎么解決?
    我的FileOutputStream是這樣定義的
    FileOutputStream fos = new FileOutputStream(ServletActionContext.getServletContext().getRealPath("/upload")+"/"+docFileName);  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2012-04-09 09:04 | Q
    @2少
    包有沖突  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2012-05-03 16:55 | anshuqing125@sina.com
    寫的不錯。唯一缺點是粘貼后要把所有空格去掉就ok了  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2012-05-21 13:02 | kelvin
    寫的非常好,正好解決的我的問題,我也是剛開始學struts2,上傳一直都報空指針,但是刷新以下后又正常了。后來自己和你的代碼核對,發現在setter和getter還有web.xml配置上有出入,然后按照你的修改后,就不會再報空指針錯誤了,這里特別推薦?。∫卜浅5脑敿殻?!  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2012-11-03 15:20 | aaa
    不知道為什么,我上傳可以成功,但其他文本框的值都取不出來,不知道為什么
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳[未登錄] 2013-06-07 13:49 | 果果
    @referee
    手動文件夾建在哪個目錄下啊、  回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2014-12-31 10:09 | 李雪梅
    為什么我能跳到成功頁面但是圖片不會顯示
      回復  更多評論
      
    # re: 在Struts 2中實現文件上傳 2014-12-31 10:10 | 李雪梅
    @果果
    在webroot下面一個文件夾  回復  更多評論
      
    評論共2頁: 1 2 下一頁 
    主站蜘蛛池模板: 国产亚洲情侣一区二区无码AV| 免费视频淫片aa毛片| 亚洲视频在线精品| 亚洲AV无码之国产精品| 在线观看人成视频免费| 亚洲国产精品99久久久久久| 国产精品国产免费无码专区不卡| 亚洲高清国产拍精品熟女| 麻豆国产精品入口免费观看| 相泽南亚洲一区二区在线播放| 国产麻豆免费观看91| 男男gay做爽爽免费视频| www亚洲一级视频com| 大片免费观看92在线视频线视频| 亚洲福利视频一区二区| 99re6在线视频精品免费| 亚洲国产人成在线观看69网站 | 成人性生交大片免费看无遮挡| 亚洲精品123区在线观看| 四虎影视永久免费观看| 成人免费网站视频www| 久久久综合亚洲色一区二区三区| 88xx成人永久免费观看| 亚洲日本VA午夜在线影院| 国产小视频在线免费| 国产又黄又爽胸又大免费视频| 久久夜色精品国产嚕嚕亚洲av| 天天影视色香欲综合免费| 亚洲精品美女久久久久久久| 亚洲精品无码av天堂| 免费在线观看一级片| 亚洲综合久久精品无码色欲| 五月婷婷亚洲综合| 日韩内射激情视频在线播放免费| 亚洲一区二区三区播放在线| www.亚洲色图.com| 色老头永久免费网站| 免费人成动漫在线播放r18| 亚洲一区二区三区首页| 麻豆国产VA免费精品高清在线 | 国产曰批免费视频播放免费s |