2

问题描述:我想使用JSP创建一个文件上传屏幕。屏幕将允许用户在屏幕上选择多个文件,但所有文件都只有一个上传按钮。单击上传按钮后,应在 Action 类中获取所有文件对象。

但重要的是页面在提交后不应该被刷新。在文件上传过程中,将在同一屏幕上显示其他不应更改的信息。

我的尝试:我使用了简单的 struts2 文件上传功能,效果很好。但它正在刷新提交页面。我使用 AJAX (JQuery) 来解决这个问题。AJAX 面临的问题是它没有将 File 对象设置为 Action 类的文件属性。因此,我无法在 Action 类中获取文件对象并进一步处理。

谁能帮我解决这个问题。

我附上了迄今为止我尝试过的任何代码。

JSP

<s:form action="fileUpload" method="post" enctype="multipart/form-data" >
<s:file id="file" name="userImage" cssClass="fileUpload" cssStyle="fileUpload" />
<button id="px-submit">Upload</button>      
</s:form>

<script type="text/javascript">
jQuery(function($){
$('.fileUpload').fileUploader();
});
</script>

JQuery 插件这是我用过的 jquery 插件。

动作类

public class FileUploadAction extends ActionSupport{

private File userImage;

public File getUserImage() {
    return userImage;
}

public void setUserImage(File userImage) {
    this.userImage = userImage;
}

public String execute()
{
    try
    {
        System.out.println("file name: " + userImage.toString());

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

    return SUCCESS;
}

编辑:这是我的 struts 配置文件。

Struts.xml

<action name="commonDataImportAction_*" class="xxx.Action">
<result name="SUCCESS" type="stream">
            <param name="contentType">text/html</param>
             <param name="inputName">inputStream</param>
        </result>

我在这里得到一个空指针,因为文件对象没有被设置。

请帮忙。

提前致谢。高拉夫

4

2 回答 2

1

我正在使用相同的插件,它对我来说工作正常。我在您的代码中看到的第一个问题是您没有设置要提交的上传按钮的类型。

<button id="px-submit" type="submit">Upload</button>

希望这应该解决空指针异常。此外,正如该插件的文档中所述,您需要返回一个 json 字符串

<div id='message'>success message</div>

成功上传。所以你需要改变你的 struts.xml 映射。试试这个,如果您遇到任何进一步的问题,请回复我。编辑:好的,这是您要求的我的代码

JSP

<form action="uploadImage" method="post" enctype="multipart/form-data">
   <input type="file" name="image" class="fileUpload" multiple/>
   <button id="px-submit" type="submit">Save all images</button>
   <button id="px-clear" type="reset">Clear all</button>
</form>

$('.fileUpload').fileUploader({
          autoUpload: false,
          buttonUpload: '#px-submit',
          buttonClear: '#px-clear',
});

动作类

您需要返回流结果。我正在使用一个插件(struts2 jquery 插件),它可以很好地处理它,但你不必仅仅因为这个要求而使用它,而是给你一个代码来返回流结果而不使用任何插件。(采取从这里

public class UploadImageAction extends ActionSupport{
        private File image;
        private String imageContentType;
        private String imageFileName;
        //getter/setter for these
        public String execute() {
         String status="";         
        try{
              //save file code here    
         status="<div id='message'>successfully uploaded</div>"; //on success
         inputStream = new StringBufferInputStream(status);
        }catch(WhateverException e){
         status="<div id='status'>fail</div><div id='message'>Your fail message</div>"; //on error
         inputStream = new StringBufferInputStream(status);
         //other code
        }

        return SUCCESS;
    }
    private InputStream inputStream;

    public InputStream getInputStream() {
       return inputStream;
    }
}

struts.xml

<action name="fileUpload" class="com.xxx.action.UploadImageAction">  
    <result type="stream">
      <param name="contentType">text/html</param>
      <param name="inputName">inputStream</param>
    </result>
  </action>
于 2012-08-09T10:02:37.330 回答
0

向您的表单添加一个target属性,并拥有一个同名的 iframe。不使用任何插件直接将多部分表单提交给操作,响应将加载到 iframe 中。这将解决您的页面刷新问题。如果您需要使用插件,那么我建议您使用http://valums.com/ajax-upload/这将为现代浏览器使用 XHR/Ajax,并在旧浏览器中优雅地降级为 iframe 上传。

于 2012-08-09T07:43:58.190 回答