@MultipartForm How to get the original file name?

前端 未结 3 1989
猫巷女王i
猫巷女王i 2021-02-19 23:42

I am using jboss\'s rest-easy multipart provider for importing a file. I read here http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Content_Marshalling_Providers.html

相关标签:
3条回答
  • 2021-02-20 00:15

    You could use @PartFilename but unfortunately this is currently only used for writing forms, not reading forms: RESTEASY-1069.

    Till this issue is fixed you could use MultipartFormDataInput as parameter for your resource method.

    0 讨论(0)
  • 2021-02-20 00:29

    After looking around a bit for Resteasy examples including this one, it seems like there is no way to retrieve the original filename and extension information when using a POJO class with the @MultipartForm annotation.

    The examples I have seen so far retrieve the filename from the Content-Disposition header from the "file" part of the submitted multiparts form data via HTTP POST, which essentially, looks something like:

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

    You will have to update your file upload REST service class to extract this header like this:

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

    Hope this helps.

    0 讨论(0)
  • 2021-02-20 00:37

    It seems that Isim is right, but there is a workaround.

    Create a hidden field in your form and update its value with the selected file's name. When the form is submitted, the filename will be submitted as a @FormParam.

    Here is some code you could need (jquery required).

    <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 讨论(0)
提交回复
热议问题