隨筆-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 閱讀(108640) 評論(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這個地方報錯,不知道咋回事?。?nbsp; 回復  更多評論
            
          # 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 下一頁 
          主站蜘蛛池模板: 柳河县| 建德市| 冷水江市| 库尔勒市| 米泉市| 滕州市| 合阳县| 新密市| 兰州市| 满洲里市| 洮南市| 青田县| 济源市| 贵南县| 聂拉木县| 邢台县| 玛多县| 阿拉尔市| 南昌县| 仙游县| 阜宁县| 平泉县| 板桥市| 乐至县| 青阳县| 安国市| 晴隆县| 青浦区| 屏东市| 永春县| 温宿县| 双牌县| 怀仁县| 公安县| 讷河市| 兴山县| 丹棱县| 镇安县| 饶河县| 榆树市| 德安县|