@MultipartForm 如何获取原始文件名?

2022-09-03 13:13:18

我正在使用jboss的轻松多部分提供程序来导入文件。我在这里阅读了有关@MultipartForm http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Content_Marshalling_Providers.html#multipartform_annotation,因为我可以用我的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。扩展名和上传的文件名将丢失。我的客户端正在尝试上传存档文件(zip,tar,z)

我需要在服务器端提供此信息,以便我可以正确应用取消存档程序。

原始文件名将发送到内容处置标头中的服务器。

如何获取此信息?或者至少我怎么能说jboss来保存带有上传的文件名和扩展名的文件?是否可以从我的应用程序进行配置?


答案 1

在查看了一些Resteasy示例(包括这个示例)之后,在将POJO类与注释一起使用时,似乎无法检索原始文件名和扩展名信息。@MultipartForm

到目前为止,我看到的示例通过HTTP POST从提交的多部分表单数据的“file”部分的标头中检索文件名,其本质上看起来像这样: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();
}

希望这有帮助。


答案 2

您可以使用@PartFilename但不幸的是,这目前仅用于编写表单,而不是阅读表单:RESTEASY-1069

在解决此问题之前,您可以将其用作资源方法的参数。MultipartFormDataInput


推荐