デジタルチャイルド日記

コンピュータ関連のいろいろメモを残していく子供部屋です。

Ajaxでファイルアップロード、そして・・・

Strutsを使ってファイルアップロードするという話があって、ちょいと調べたのでメモ。

 

Strutsのファイルアップロード

Strutsからファイルアップロードをする場合、ActionFormにFormFileクラスのプロパティを用意するのが一番手っ取り早そうだ。

 

■ActionForm側

public class FileUploadForm extends ActionForm{

  private FormFile file;

  /**
   * @return file
   */
  public FormFile getFile() {
    return file;
  }

  /**
   * @param file セットする file
   */
  public void setFile(FormFile file) {
    this.file = file;
  }
}

こんな感じ。これで、基本的にはファイルが受け取れる。

ただ、今回は画面Aで画像を選択して、確認ボタンを押下すると、モーダルダイアログを起動して、画像を表示するという仕様らしく(えらく古い仕様だ・・)

この調査中にshowModalDialogがすでに廃止された仕様であることが発覚して、どうしたものか思っているところでもある・・・w

 

さて、そんな仕様のため、単純にフォームからPOSTするとうわけにもいかず。

※showModalDialogにはPOSTできないらしい。

 

そこで思いついたのが、確認ボタン時にAjaxで画像だけ先行してアップロードしちゃって、そのあとJavaScriptで画像ファイル名なんかを引数にモーダルを開くって方法。

 

調べてみたら、JQueryAjaxで画像がアップロードできるらしいじゃないか。

 

で、以下がそのコード。

JavaScript
$(function() {
  $("input[name='upload']").click(function(){
    // ファイルアップロードのデータ生成
    var formData = new FormData();
    if ($("input[name='file']").val()!== '') {
      formData.append( "file", $("input[name='file']").prop("files")[0] );
    }
    // AJAX通信
    $.ajax({
      url : "/StrutsSample/fileUpload.do",
      type : "POST",
      data : formData,
      processData : false,
      contentType : false,
      dataType: "json",
      success : function(result) {
        // ここに、showModalDialogを記述して、画像パスを渡せば、いけんじゃね?
        alert(result.linkString);
      },
      error : function(xml,status,etc) {
      }
    });
  });
});

■HTML

<form action="" method="post">
  <input type="file" name="file">
  <input id="text" type="hidden" value="hoge">
  <input type="button" name="upload" value="アップロード">
</form>

 肝になるのは、contentType:false と processData: falseらしい。

 

なお、以下のようにすれば、ファイル以外も同時にあげれるらしい。

  // 追加データ
  formData.append("text",$("#text").val());

 しかし、いまさらshowModalDialogを使うのも、悩みどころ。

 

【後日談:2018/04/30】

最終的にはshowModalDialogでなくてもいいということになった。ほかの機能でできないと判断されたらしく、普通にJavaScriptでpostすることになった。

その際にIEだけうまくいかないという風に言われたが、特に問題なく稼働している・・謎w