随笔-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,这并没有什么特别之处。接下来,标志将文件上传控件绑定到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中的标志。但是前两者并没有显式地与任何的页面标志绑定,那么它们的值又是从何而来的呢?其实,标志不仅仅是绑定到myfile,还有myfilecontenttype(上传文件的mime类型)和myfilefilename(上传文件的文件名,该文件名不包括文件的路径)。因此,对应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/ 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

发布运行应用程序,在浏览器地址栏中键入:,出现图示页面:


清单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,在与之间加入“”,用于在页面上输出错误信息。

然后修改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实现多文件上传也很简单。你可以将多个绑定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中实现文件上传的确是轻而易举,您要做的只是使用与action的属性绑定。这又一次有力地证明了struts 2的简单易用。

posted on 2007-03-21 00:48 max 阅读(108296) 评论(148)     所属分类: struts 2.0系列
评论共2页: 1   

评论:
# re: 在struts 2中实现文件上传 2007-08-29 13:50 |
好像还应该加入包servlet-api.jar !!!  回复  
  
# re: 在struts 2中实现文件上传 2007-09-03 16:58 |
好像filename取出来的是null呀,有人碰到这种情况吗?  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2007-09-04 09:40 |
我取出来的filename也是null啊,到底怎么搞的,有些地方没有讲清楚  回复  
  
# re: 在struts 2中实现文件上传 2007-09-04 16:13 |
我取出的也是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 |
怎么没有人回答?请高手指教  回复  
  
# re: 在struts 2中实现文件上传 2007-09-05 00:35 | max
@mike
@tf
请细心对照我文中的步骤去做,结果应该会出来的。
或者你的web-inf/web.xml的内容,是否有加入:
< filter >
< filter-name > struts2
< filter-class >
org.apache.struts2.dispatcher.filterdispatcher

  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2007-09-07 15:59 |
@li
@tf
我想我大概知道错误的原因了,你们可能是漏了一些get/set方法,或者是自己在struts.xml中加入了,这个不需要自己加入的,是struts2内置的interceptor,会自动调用。我希望我的解决方法可以对你们有用,这里也要对max说声对不起了,没有跑出来是自己没按照规则来做。  回复  
  
# re: 在struts 2中实现文件上传 2007-09-10 16:59 |
请问max可以出个和文件上传对应的文件下载的例子吗?  回复  
  
# re: 在struts 2中实现文件上传 2007-09-10 17:09 |
谁有和文件下载的的例子的麻烦发到我邮箱好吗?
我的邮箱是susu_zi@126.com  回复  
  
# re: 在struts 2中实现文件上传 2007-09-12 15:53 |
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 |
学习中!
在此感谢max!  回复  
  
# re: 在struts 2中实现文件上传 2007-09-13 17:46 |
@max
我没有看错的,我试过了show case中的相关例子,它拿到的的确是list类型的,但我拿到的却是string的,是不是还需要在哪里配置?或者是jar包的版本问题?  回复  
  
# re: 在struts 2中实现文件上传 2007-09-14 09:53 |

@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 |
提醒一下,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 |
文件类型里明明有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 |
上面有人出现的问题我也遇到了,搞不来,哪位高人帮帮忙
java.io.filenotfoundexception: f:\cvs_root\struts\webcontent\uploadimages\1191902350707.bmp (系统找不到指定的路径。)
at java.io.fileoutputstream.open(native method)
at java.io.fileoutputstream.(unknown source)
at java.io.fileoutputstream.(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 |
是文件夹要手动建立  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2007-10-10 12:42 |
不错,什么时候来个struts2 hibernate spring整合,期待中。。。。。。。。  回复  
  
# re: 在struts 2中实现文件上传 2007-10-31 16:57 |
struts2.0的上传文件大小默认是2m
可以通过在struts.xml里来修改这个大小


但是遇到个问题就是
这里假如我设置的是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 |
@游客
遇到一个问题,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 |
我在上传的action中加了拦截器以后,别的action请求也被拦截下来了,fileupload是全局的吗?怎么解决?  回复  
  
# re: 在struts 2中实现文件上传 2007-11-29 09:37 |
method="dofileupload">


application/vnd.ms-excel,text/plain



web-inf/jsp/zzz/upload.jsp
web-inf/jsp/zzz/upload.jsp

method="uploadclear">
web-inf/jsp/zzz/upload.jsp
web-inf/jsp/zzz/upload.jsp

uploadclear提交不到action中去,怎么会这样?  回复  
  
# re: 在struts 2中实现文件上传 2007-11-29 10:15 |
大家帮我看看这个错误啊,包已经添进去了,怎么回事呢?

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 |
终于出来了
相当感谢啊
我是小菜鸟 多多指教!  回复  
  
# re: 在struts 2中实现文件上传 2007-12-22 09:59 |
上传一个大文件时,struts2的拦截器,会报错,说文件过大。但是一次上传几个大文件时,struts2的拦截器就不报任何错误了,也没有提示,不知道为什么啊?  回复  
  
# re: 在struts 2中实现文件上传 2007-12-26 10:14 |
啊 我也出现了这个问题

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 |
这么写会存在并发问题吧?  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2007-12-29 21:56 |
当我上传一个空文件时(比如说我建一个 新建文件.txt),报空指针异常,我觉得只要文件存在不管里面有没有内容都不应该报错的啊,为什么?  回复  
  
# re: 在struts 2中实现文件上传 2008-01-04 18:03 |
写的东西不完全对啊  回复  
  
# re: 在struts 2中实现文件上传 2008-01-09 20:15 |
我想问一下,我的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 |
struts2的文件上传只能说是简单的文件上传。
如果一个网站文件上传很重要的话,需要仔细的考虑各种可能性。
  回复  
  
# re: 在struts 2中实现文件上传 2008-02-22 13:10 |
我无法通过拦截器控制上传类型,代码在下面,有谁能帮我看看,我试了很久fileuploadstack这个拦截器就是不起作用,什么文件都能上传。
struts.xml:




image/bmp,image/png,image/gif,image/jpeg


/upload.jsp
/show.jsp

upload.jsp:








  回复  
  
# re: 在struts 2中实现文件上传 2008-03-13 21:50 |
@babala

要传.jpg格式的图片,应该是image/pjpeg。
我也不知道为什么,但我按照错误提示,修改后就ok了,希望对你有用  回复  
  
# re: 在struts 2中实现文件上传 2008-04-03 09:29 |
各位有调通多文件上传的吗?多文件上传时,如何把filename,contenttype和页面的绑定呢??  回复  
  
# re: 在struts 2中实现文件上传 2008-04-14 19:53 |
如果要上传到数据库怎么修改action和struts.xml配置文件(结合hibernate和spring)  回复  
  
# re: 在struts 2中实现文件上传 2008-04-25 10:21 |

image/bmp,image/png,image/gif,image/jpeg,text/xml,application/zip


这里这样写还是不可以传xml格式和zip格式的  回复  
  
# re: 在struts 2中实现文件上传 2008-05-12 21:48 |
@eddie
我也打印不出来
不知道如何修改阻止提交文件的非图片类型以及
显示我友好的错误信息  回复  
  
# re: 在struts 2中实现文件上传 2008-05-27 20:27 |
请问如何更改上传的路径啊
我想要更改成指定路径啊
请多多指教啊  回复  
  
# re: 在struts 2中实现文件上传 2008-05-29 06:06 |
321564165  回复  
  
# re: 在struts 2中实现文件上传 2008-06-02 15:23 |
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 |
有完整例子吗包括lib。发一份不胜感激cheerzan@yahoo.com.cn  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2008-08-07 13:08 |
@max
我作如下设置:
struts.xml:
102400

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

strusts.properties:
struts.multipart.maxsize=1048576

当上传的图片大小size:1024001048576时,页面并不提示,尽管后台打印出了文件太大的信息。我怎么让它在页面也表现出来呢???  回复  
  
# re: 在struts 2中实现文件上传 2008-08-18 11:38 |
# re: 在struts 2中实现文件上传 2007-11-26 09:35 | @游客
点击文件上传时提示invalid field value for field "myfile",我的也出现了这个问题,但是我解决了,因为我使用的是 普通的form ,没有使用标签,但我的form 中,没有添加 method='post' 属性,添加后,可以上传文件了。 希望对其它人有帮助。  回复  
  
# re: 在struts 2中实现文件上传 2008-11-03 21:45 |
为什么我什么都是对的,就是图片不显示啊,郁闷,大家帮帮忙啊...  回复  
  
# re: 在struts 2中实现文件上传 2008-11-12 11:18 |
@yihaijian
文件路径错误了吧  回复  
  
# re: 在struts 2中实现文件上传 2008-11-19 10:46 |
感觉跟你们相见恨晚
向你们看齐·  回复  
  
# re: 在struts 2中实现文件上传 2008-11-19 10:56 |
学习struts中,每次程序错误,上网都可以找到高人的解答方法,有种相见恨晚感觉,努力向你们看齐  回复  
  
# re: 在struts 2中实现文件上传 2008-12-16 10:28 |
请问,为什么我上传的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 |
正在学习struts 2 支持  回复  
  
# re: 在struts 2中实现文件上传 2009-01-19 19:07 |
我运行你的第二个例子的时候,就是限制文件类型时,出错,我按照你的配置修改struts.xml,在上传非图片格式的文件时,仍然可以上传上去,这是怎么回事呀?  回复  
  
# re: 在struts 2中实现文件上传 2009-01-19 19:18 |
@joe
你的错误是在fileuploadaction.java中getextention方法下的filename.lastindexof( "." );引号中只有一个点,而不是有有空格加点的(" . ")这种,我今天碰到这种问题,我把它改过来就可以运行第一个例子了  回复  
  
# re: 在struts 2中实现文件上传 2009-02-05 16:39 |
@zoninge
你的问题怎么解决的阿?我也出现这个问题了  回复  
  
# re: 在struts 2中实现文件上传 2009-03-17 21:15 |
file imagefile = new file(servletactioncontext.getservletcontext().getrealpath( " /uploadimages " ) " / " imagefilename);

请问一下,这句代码是用来干什么的呢?


我在编译action的时候,老是说 无法访问javax.servlet.servletcontext
然后说上面那一句代码有错误  回复  
  
# re: 在struts 2中实现文件上传 2009-04-27 18:10 |
刚学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 |
@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 |
太感谢 了。   回复  
  
# re: 在struts 2中实现文件上传[未登录] 2009-08-09 12:53 |
thanks   回复  
  
# re: 在struts 2中实现文件上传 2009-10-12 22:18 |
在struts2上传时,我碰到个问题,想请教
如果某个文章记录已经上传了图片,而后来发现这个记录要修改,但不需要重新上传图片,只需要修改其它的字段,提交后,发现原来上传的图片记录就没有了

为此我还得在页面另外隐藏一个字段,并且在action里做大段处理代码。想请问一下你是否碰到过此问题
  回复  
  
# re: 在struts 2中实现文件上传 2009-11-04 22:38 |
存数据库里只需要把filename图片名存进去i就ok,其实也没必要存数据库的图片的话,放服务器上就行  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2009-11-27 15:08 |
如果我多文件上传,一个文件只准上传图片格式,另外一个没有限制了,该怎么办?  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2009-12-10 14:38 |
請問下,我照你的全都寫了,在上傳那個頁面不管你上傳什麼都不會跳過去,根本一點跳動都沒有,不知道是什麼原因?有沒高手遇到過?  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2009-12-10 14:44 |
@@wo
我都是一字不漏的全復過來的,就是在上傳那個頁面根本就不跳,,發呆了  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2009-12-11 15:34 |
您好,我想请问下您写的第一个我试了下报出下面异常:
imagefilename===1260516248015.jpg
java.io.filenotfoundexception: d:\tomcat 6.0\webapps\struts28\uploadimages (存取被拒。)
at java.io.fileoutputstream.open(native method)
at java.io.fileoutputstream.(fileoutputstream.java:179)
at java.io.fileoutputstream.(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 |
public void setmyfilecontenttype(string contenttype) {
this .contenttype = contenttype;
}

public void setmyfilefilename(string filename) {
this .filename = filename;
}
这两个方法名是固定的吗?为什么?  回复  
  
# re: 在struts 2中实现文件上传 2010-03-17 16:58 |

在此先感谢作者的这篇文章。
上个问题明白了  回复  
  
# re: 在struts 2中实现文件上传 2010-07-17 16:27 |
你能跳转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 |
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 |
遇到的问题应该是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 |
@樱花草
这个问题很简单,你的项目是放在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 |
缺少common-fileupload.jar@renminyan
  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2011-10-11 23:58 |
不要直接把代码复制过去,仔细检查一下,会发现有问题的@li
  回复  
  
# re: 在struts 2中实现文件上传 2011-10-25 08:57 |
你好 我是新人 ,希望多多指点,文件上传到什么地方去了,如果我要把文件上传到数据库去 怎么办????  回复  
  
# re: 在struts 2中实现文件上传 2011-10-25 09:09 |
@tf
你看下setmyfilefilename有没弄错  回复  
  
# re: 在struts 2中实现文件上传 2011-10-25 09:26 |
你好 我是新人 ,希望多多指点,文件上传到什么地方去了,如果我要把文件上传到数据库去 怎么办???? 我的邮箱是zgb6219@163.com 谢谢了。  回复  
  
# re: 在struts 2中实现文件上传 2011-10-31 13:55 |
@allen
你好 说说maximumsize在哪设置30m的大小 啊 谢谢 我一直没弄出来文件大小的设置  回复  
  
# re: 在struts 2中实现文件上传 2011-11-23 14:25 |
博主您好,我照您的方法敲了代码,不过有个问题,就是上传的文件不是存在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 |
@2少
包有冲突  回复  
  
# re: 在struts 2中实现文件上传 2012-05-03 16:55 |
写的不错。唯一缺点是粘贴后要把所有空格去掉就ok了  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2012-05-21 13:02 |
写的非常好,正好解决的我的问题,我也是刚开始学struts2,上传一直都报空指针,但是刷新以下后又正常了。后来自己和你的代码核对,发现在setter和getter还有web.xml配置上有出入,然后按照你的修改后,就不会再报空指针错误了,这里特别推荐!!也非常的详细!!  回复  
  
# re: 在struts 2中实现文件上传[未登录] 2012-11-03 15:20 |
不知道为什么,我上传可以成功,但其他文本框的值都取不出来,不知道为什么
  回复  
  
# 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   

只有注册用户后才能发表评论。


网站导航:
              
 
网站地图