Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[ecf-dev] File name of retrieved file

When obtaining a file from a remote source it is often good to know the intended filename. It might be used in progress reporting and sometimes also as a source of information when naming the resulting local file.

The URL in itself is sometimes very cryptic and the path might contain a name in some numeric form (calculated UUID perhaps). In some cases, the path doesn't contain a name at all (ends with download.php for instance) and the actual path is hidden in one of the parameters. When using HTTP, the returned "Content-Disposition" response header field is often a much better source for the filename the the actual URL.

Using ECF, I cannot obtain this header field and that's OK. There's a lot of transfer implementations where use of response headers isn't applicable. I would however like a IIncomingFileTransfer.getRemoteFileName() method. The HTTP transfer could use the Content-Disposition and other file transfer implementation could do a best effort based on whatever algorithm that would be appropriate for them. I'm attaching the code that Buckminster uses to extract the file name from the Content-Disposition header below.

What do you think? Could something like this be make available in ECF incoming file transfer?

Regards,
Thomas Hallgren



   /**
* This regular expression is a simple Content-Disposition header parser. * Content-Disposition grammar is quite complex, this is really simplified.
    * It should be refactored in future versions using proper grammar.
    */
private final static Pattern s_contentDispositionPattern = Pattern.compile( ".*;\\s*filename\\s*=\\s*(\"(?:[^\"\\\\]|\\\\.)*\"|[^;\"\\s]+)\\s*(?:;|$)");

   private static String parseContentDisposition(String contentDisposition)
   {
//Context-Dispositon syntax: attachment|inline[;filename="<filename>"] //Try to extract the filename form it (and strip quotes if they're there) if (contentDisposition == null)
           return null;
String filename = null;
       Matcher m = s_contentDispositionPattern.matcher(contentDisposition);

       if (m.matches()) {
           filename = m.group(1);
           if (filename.startsWith("\"") && filename.endsWith("\"")) {
filename = filename.substring(1, filename.length()-1).replaceAll("\\\\(.)", "$1");
           }
} return filename;
   }



Back to the top