我在前台键立了一如下的页面:
  
<form id="frmUpload" action="${base}/cmsmember/dataImportAct.jspx" method="post" enctype="multipart/form-data" onsubmit="return OnSubmit();" >
   
<table class="fullHeight" cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td nowrap="nowrap">
<span id="eUploadMessage">Upload a new file in this folder</span><br>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tr>
<td width="100%"><input id="upload" name="upload" style="WIDTH: 100%" type="file"></td>
<td nowrap="nowrap">&nbsp;<input id="btnUpload" type="submit" value="上传"></td>
</tr>
</table>
</td>
</tr>
</table>
<input type="hidden" name="backUrl" value="${wholeUrl}"/>
  </form>
然后我配置了相应的action,响应action的代码类如下:package com.jeecms.cms.action.front;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;import com.jeecms.cms.CmsMemberAction;
import com.jeecms.cms.manager.NsrMng;/**
 * 数据导入类。
 * @author sou
 *
 */
@Scope("prototype")
@Controller("cms.dataImportAct")
public class DataImport extends CmsMemberAction {



public File getUpload() {
return upload;
} public void setUpload(File upload) {
this.upload = upload;
} public String dataImportAct() throws IOException
{

File str=upload;
if(str!=null)
{
contextPvd.setSessionAttr("msg", "读文件成功!");
}
return this.handleResult("dataImport");
}

private File upload; @Autowired
private NsrMng nsrMng;}问题是,当我点击上传时,跟踪发现,upload是null的,而我如果放个text控件上去读时又能读取得到。
请问应该如何解决,使我可以得到这个文件,建立一个inputStream对象呢。请高手指教。

解决方案 »

  1.   

    你还需要定义:
    private String uploadFileName;
    private String uploadContentType;
    并提供相应的get/set方法。
      

  2.   

    我定义了,但还是得的是NULL。
    代码如下:package com.jeecms.cms.action.front;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import org.apache.commons.fileupload.FileItem;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;import com.jeecms.cms.CmsMemberAction;
    import com.jeecms.cms.manager.NsrMng;/**
     * 数据导入类。
     * @author sou
     *
     */
    @Scope("prototype")
    @Controller("cms.dataImportAct")
    public class DataImport extends CmsMemberAction {



    public File getUpload() {
    return upload;
    } public void setUpload(File upload) {
    this.upload = upload;
    } public String getUploadFileName() {
    return uploadFileName;
    } public void setUploadFileName(String uploadFileName) {
    this.uploadFileName = uploadFileName;
    } public String getUploadContentType() {
    return uploadContentType;
    } public void setUploadContentType(String uploadContentType) {
    this.uploadContentType = uploadContentType;
    } public String dataImportAct() throws IOException
    {

    File str=upload;
    if(str!=null)
    {
    contextPvd.setSessionAttr("msg", "读文件成功!");
    }
    return this.handleResult("dataImport");
    }

    private File upload;
    private String uploadFileName;
    private String uploadContentType; @Autowired
    private NsrMng nsrMng;}
      

  3.   

    你的 CmsMemberAction 是否extends ActionSupport(或间接extends)
      

  4.   

    dataImportAct.jspx.jspx是不是你配的一个什么东东?
      

  5.   

    这是一个没关系的,不管什么后缀名,只要前面对了,他都会响应dataIportAct这个方法的。
      

  6.   

    从你的页面  和代码上来看, 没有任何问题.. 看看是不是你struts.xml配置哪里不对了?
      

  7.   

    回四楼的,我的dataImport没有继承 ActionSupport这个类是继承其它的类的。有什么解决方法吗?
      

  8.   

    我的struts配置文件是这样配置的:
    <!--数据导入动作-->
    <action name="dataImportAct" method="dataImportAct" class="cms.dataImportAct">
    <result>${tplPath}</result>
    </action>
      

  9.   

    把你的action
     implements ServletRequestAware;
    并加上
    private HttpServletRequest request;
    public void setServletRequest(HttpServletRequest request) {
    this.request = request;
    }不知道能不能解决问题再不行就 extends ActionSupport
      

  10.   

    总看到这位兄弟在回答struts2的问题, 但是基本都没答到点上.!
    如果不是要国际化或者是数据校验, action根本都不用继承ActionSuopport,  文件上传时靠的拦截器干的.!  注入requeust.? request拿ServletActionContext不是一样拿.?
      

  11.   

    个人观点: 你的action没有被文件上传拦截器栏,  所以获得的总是null.!
    看看是不是你这个package下的配置了其他自己的拦截器?
      

  12.   

    还没有发现我的包下配了其它的拦截器呢。有如下的拦截器:
    <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
      

  13.   

    哈哈,我发现了,原来我这个action所在的包没有fileUpload这个拦截器,
    我把这个action改放到有fileUpload的package下,再运行时就发现可以得到file对象了。
      

  14.   

    在我意料之中.. 肯定是你这个action所在的包有自己的拦截器引用, 但是不包含文件上传的.!
    LZ以后建议你以后定义你自己拦截器引用的同事
    加上
    <interceptor-ref name="defaultStack">
    这个默认的拦截器引用包含很多拦截器,包括了文件上传的!