@MultipartForm как получить исходное имя файла?

Я использую REST-easy multipart provider 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;
    }
}

затем я получил объект file и напечатал его абсолютный путь, и он вернул имя файла типа file. Расширение и имя загруженного файла: потерянный. Мой клиент пытается загрузить архивный файл (zip,tar,z)

Мне нужна эта информация на стороне сервера, чтобы я мог правильно применить программу un-archive.

исходное имя файла отправляется на сервер в заголовке content-disposition.

Как я могу получить эту информацию? Или, по крайней мере, как я могу сказать jboss, чтобы сохранить файл с загруженным именем файла и расширением? Он настраивается из моего приложения?

3 ответов


после просмотра вокруг немного для Resteasy примеров, включая это один, похоже, что нет способа получить исходное имя файла и информацию о расширении при использовании класса POJO с @MultipartForm Примечание.

примеры, которые я видел до сих пор, извлекают имя файла из 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();
}

надеюсь, что это помогает.


можно использовать @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>