ファイルのインポートに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と言うにはどうすればよいですか?アプリケーションから構成できますか?
この 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();
}
お役に立てれば。
@ PartFilename を使用できますが、残念ながら、これは現在、フォームの読み取りではなく、フォームの書き込みにのみ使用されています: RESTEASY-1069 。
この問題が修正されるまで、リソースメソッドのパラメーターとしてMultipartFormDataInput
を使用できます。
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>