web-dev-qa-db-ja.com

@MultipartForm元のファイル名を取得するにはどうすればよいですか?

ファイルのインポートにjbossの簡単なマルチパートプロバイダーを使用しています。私はここを読みました http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Content_Marshalling_Providers.html#multipartform_annotation @MultipartFormについては、正確にマッピングできるためです。 POJO。

以下は私のPOJOです

public class SoftwarePackageForm {

    @FormParam("softwarePackage")
    private File file;

    private String contentDisposition;

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public String getContentDisposition() {
        return contentDisposition;
    }

    public void setContentDisposition(String contentDisposition) {
        this.contentDisposition = contentDisposition;
    }
}

次に、ファイルオブジェクトを取得し、その絶対パスを出力すると、ファイルタイプのファイル名が返されました。拡張子とアップロードされたファイル名は失われます。クライアントがアーカイブファイル(Zip、tar、z)をアップロードしようとしています

アーカイブ解除プログラムを適切に適用できるように、サーバー側でこの情報が必要です。

元のファイル名は、content-dispositionヘッダーでサーバーに送信されます。

この情報を取得するにはどうすればよいですか?または、少なくとも、アップロードされたファイル名と拡張子でファイルを保存するようにjbossと言うにはどうすればよいですか?アプリケーションから構成できますか?

11

この one を含むResteasyの例を少し調べたところ、@MultipartFormアノテーション付きのPOJOクラスを使用する場合、元のファイル名と拡張子の情報を取得する方法がないようです。

これまでに見た例では、HTTP POSTを介して、送信されたマルチパートフォームデータの「ファイル」部分のContent-Dispositionヘッダーからファイル名を取得します。これは、基本的に次のようになります。

Content-Disposition: form-data; name="file"; filename="your_file.Zip"
Content-Type: application/Zip

このヘッダーを次のように抽出するには、ファイルアップロードRESTサービスクラスを更新する必要があります:

@POST
@Path("/upload")
@Consumes("multipart/form-data")
public Response uploadFile(MultipartFormDataInput input) {

  String fileName = "";
  Map<String, List<InputPart>> formParts = input.getFormDataMap();

  List<InputPart> inPart = formParts.get("file"); // "file" should match the name attribute of your HTML file input 
  for (InputPart inputPart : inPart) {
    try {
      // Retrieve headers, read the Content-Disposition header to obtain the original name of the file
      MultivaluedMap<String, String> headers = inputPart.getHeaders();
      String[] contentDispositionHeader = headers.getFirst("Content-Disposition").split(";");
      for (String name : contentDispositionHeader) {
        if ((name.trim().startsWith("filename"))) {
          String[] tmp = name.split("=");
          fileName = tmp[1].trim().replaceAll("\"","");          
        }
      }

      // Handle the body of that part with an InputStream
      InputStream istream = inputPart.getBody(InputStream.class,null);

      /* ..etc.. */
      } 
    catch (IOException e) {
      e.printStackTrace();
    }
  }

  String msgOutput = "Successfully uploaded file " + filename;
  return Response.status(200).entity(msgOutput).build();
}

お役に立てれば。

15
ivan.sim

@ PartFilename を使用できますが、残念ながら、これは現在、フォームの読み取りではなく、フォームの書き込みにのみ使用されています: RESTEASY-1069

この問題が修正されるまで、リソースメソッドのパラメーターとしてMultipartFormDataInputを使用できます。

2
lefloh

Isimは正しいようですが、回避策があります。

フォームに非表示フィールドを作成し、選択したファイルの名前でその値を更新します。フォームが送信されると、ファイル名は@FormParamとして送信されます。

これがあなたが必要とするかもしれないいくつかのコードです(jqueryが必要です)。

<input id="the-file" type="file" name="file">
<input id="the-filename" type="hidden" name="filename">

<script>
$('#the-file').on('change', function(e) {
    var filename = $(this).val();
    var lastIndex = filename.lastIndexOf('\\');
    if (lastIndex < 0) {
        lastIndex = filename.lastIndexOf('/');
    }
    if (lastIndex >= 0) {
        filename = filename.substring(lastIndex + 1);
    }
    $('#the-filename').val(filename);
});
</script>
0
Αλέκος