2014-10-13 126 views
9

我正在使用jboss的rest-easy多部分提供程序來導入文件。我在這裏閱讀http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Content_Marshalling_Providers.html#multipartform_annotation關於@MultipartForm,因爲我可以將它準確映射到我的POJO。@MultipartForm如何獲取原始文件名?

下面是我的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)

我在服務器端需要這些信息,以便我可以正確應用解壓縮程序。

原始文件名在內容處置標題中發送到服務器。

我怎樣才能得到這些信息?或者至少我怎麼說jboss來保存上傳的文件名和擴展名的文件?它可以從我的應用程序配置嗎?

+0

你可以嘗試在你的''文件'中添加'@PartType(「application/zip」)'並查看它是否有效?完整的包是'org.jboss.resteasy.annotations.providers.multipart.PartType'。 –

+0

@isim是的,我會嘗試。 tar和Z文件的價值是什麼? –

+0

@isim沒有用:(它沒有用,我不明白爲什麼人們在沒有提供原始apis提供的所有功能的時候包裝apis,他們說某些事情可以做得更好,他們提供apis,他們會介紹更多問題,當我們知道這一點時,我們就被鎖定了,我從這裏開始工作了將近3天,並感到厭倦 –

回答

10

在環視了一下Resteasy的例子,包括這個one後,似乎沒有辦法檢索使用帶有@MultipartForm批註的POJO類時的原始文件名和擴展信息。

我已經看到了這麼遠提交的multipart的「文件」部分檢索來自Content-Disposition頭文件名中的例子形成通過HTTP POST,基本上,看起來像數據:

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(); 
} 

希望這有助於。

+0

是的,我已經回到了這個方法,我在他們的論壇上提出了一個問題,在這裏https ://issues.jboss.org/browse/RESTEASY-1115。感謝您的努力。 –

+0

聽起來不錯。你會考慮將這個答案標記爲接受嗎? :) 謝謝。 –

2

您可以使用@PartFilename,但不幸的是,目前這僅用於書寫表格,而不用於閱讀表格:RESTEASY-1069

直到此問題已解決,您可以使用MultipartFormDataInput作爲您的資源方法的參數。

0

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> 
相關問題