2

問題の説明:JSPを使用してファイルアップロード画面を作成したい。この画面では、ユーザーは画面上の複数のファイルを選択できますが、すべてのファイルに対して1つのアップロードボタンしかありません。アップロードボタンをクリックすると、すべてのファイルオブジェクトがActionクラスで取得されます。

ただし、重要なことは、送信後にページが更新されないようにすることです。同じ画面に表示される他の情報がありますが、ファイルのアップロード中に変更されるべきではありません。

私の試み:私はうまく機能する単純なstruts2ファイルアップロード機能を使用しました。しかし、それは提出時にページを更新しています。これを解決するためにAJAX(JQuery)を使用しました。私がAJAXで直面している問題は、FileオブジェクトをActionクラスのfileプロパティに設定していないことです。したがって、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>

ファイルオブジェクトが設定されていないため、ここでnullpointerを取得します。

助けてください。

前もって感謝します。Gaurav

4

2 に答える 2

1

私は同じプラグインを使用していますが、正常に機能しています。コードに最初に見られる問題は、送信するアップロードボタンのタイプを設定していないことです。

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

うまくいけば、これはnullポインタを除いて解決するはずです。また、このプラグインのドキュメントに記載されているように、json文字列を返す必要があります

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

アップロードが成功したとき。したがって、struts.xmlマッピングを変更する必要があります。これを試してから、さらに問題が発生した場合は私に連絡してください。編集:OKここにあなたが要求した私のコードがあります

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プラグインを使用していますが、この1つの要件のためだけに使用する必要はありません。代わりに、プラグインを使用せずにストリーム結果を返すコードを提供しています。(Takenここから)

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 に答える