Hello Joakim,

Thank you for your quick response to my question - it sounds as though the root 
of our problem is an ambiguity or difference in interpretation of the servlet 
specification.

> I bet your configuration has MultipartConfig.location set to java.io.tmpdir 
> (the default value), hence why your transferTo() is prefixed with "/tmp"


That sounds like a good bet to me… :-)

Best wishes,

Robert


> On 26 Feb 2018, at 17:49, Joakim Erdfelt <[email protected]> wrote:
> 
> Some more background/detail on this ...
> 
> Interestingly page 224 of the Servlet 4.0 metions this ..
> 
> https://javaee.github.io/servlet-spec/downloads/servlet-4.0/servlet-4_0_FINAL.pdf
>  
> <https://javaee.github.io/servlet-spec/downloads/servlet-4.0/servlet-4_0_FINAL.pdf>
> 
> 21. Clarify interpretation of fileName parameter for method Part.write(). See 
> the javadoc for details.
> 
> Found the issue for Part.write at ...
> 
> https://github.com/javaee/servlet-spec/issues/172 
> <https://github.com/javaee/servlet-spec/issues/172>
> 
> Finally a link to Part.write in the Servlet 4.0 Part.write update ...
> 
> https://github.com/javaee/servlet-spec/blob/4.0.0/src/main/java/javax/servlet/http/Part.java#L93-L113
>  
> <https://github.com/javaee/servlet-spec/blob/4.0.0/src/main/java/javax/servlet/http/Part.java#L93-L113>
> 
> 
> 
> 
> 
> Joakim Erdfelt / [email protected] <mailto:[email protected]>
> On Mon, Feb 26, 2018 at 11:31 AM, Joakim Erdfelt <[email protected] 
> <mailto:[email protected]>> wrote:
> You should never assume that Part.write() or .transferTo() accepts fully 
> qualified locations on disk, its always relative to the 
> MultipartConfig.location.
> 
> See:
> https://github.com/eclipse/jetty.project/issues/1337 
> <https://github.com/eclipse/jetty.project/issues/1337>
> https://docs.oracle.com/javaee/7/api/javax/servlet/http/Part.html 
> <https://docs.oracle.com/javaee/7/api/javax/servlet/http/Part.html>
> https://docs.oracle.com/javaee/7/api/javax/servlet/http/Part.html#write-java.lang.String-
>  
> <https://docs.oracle.com/javaee/7/api/javax/servlet/http/Part.html#write-java.lang.String->
>  
> 
> The Apache Commons File Upload package (last time I looked) will delegate to 
> the servlet spec HttpServletRequest.getPart() behavior.
> Since Tomcat's Part.write(String) allows you to write to any arbitrary 
> location on disk that's how Apache Commons File Upload expects it.
> 
> The javadoc for Part.write() says it will write relative to the 
> MultipartConfig.location.
> 
> I bet your configuration has MultipartConfig.location set to java.io.tmpdir 
> (the default value), hence why your transferTo() is prefixed with "/tmp"
> 
> This was brought up in the Servlet spec 4.0 discussions (not sure how it was 
> resolved)
> 
> 
> Joakim Erdfelt / [email protected] <mailto:[email protected]>
> 
> On Mon, Feb 26, 2018 at 11:17 AM, Robert Stroud <[email protected] 
> <mailto:[email protected]>> wrote:
> Hello,
> 
> We are using Jetty Runner 9.4.8 to launch a Java web application from a WAR 
> file and have encountered a problem with file uploads. The code in question 
> works fine if the WAR file is launched by Tomcat, but fails if the WAR file 
> is launched by Jetty Runner, which suggests that there may be a problem with 
> the way in which we have configured Jetty Runner.
> 
> The application is written in Grails, which runs on Spring Boot, so we are 
> using the Spring MultipartFile interface to upload the file. At the point at 
> which the web application attempts to store a copy of the uploaded file in a 
> local folder on the web server, we get a  “File not found exception”. This 
> appears to be caused by the value of “java.io.tmpdir” being prepended to the 
> target filename, which means that the path is invalid. Can anyone suggest why 
> this might be happening?
> 
> In more detail, the relevant line of code is
> 
>         uploader.transferTo(“/some/destination”)        // make a local copy 
> of the file upload
> 
> and the exception is
> 
>         java.io.FileNotFoundException: /tmp/some/destination/file (No such 
> file of directory)
> 
> Note that “/tmp” (or more precisely, the value of System.getProperty(“java.io 
> <http://java.io/>.tmpdir”)) has been prepended to the destination pathname, 
> which makes it invalid.
> 
> The problem seems to be with the implementation of the Spring MultipartFile 
> interface on Jetty Launcher - I believe Spring Boot is using an 
> implementation based on the Apache Commons File Upload package. Does anyone 
> know of a reason why this might not work on Jetty?
> 
> Thanks for any help or suggestions.
> 
> Best wishes,
> 
> Robert
> 
> _______________________________________________
> jetty-users mailing list
> [email protected] <mailto:[email protected]>
> To change your delivery options, retrieve your password, or unsubscribe from 
> this list, visit
> https://dev.eclipse.org/mailman/listinfo/jetty-users 
> <https://dev.eclipse.org/mailman/listinfo/jetty-users>
> 
> _______________________________________________
> jetty-users mailing list
> [email protected]
> To change your delivery options, retrieve your password, or unsubscribe from 
> this list, visit
> https://dev.eclipse.org/mailman/listinfo/jetty-users

_______________________________________________
jetty-users mailing list
[email protected]
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://dev.eclipse.org/mailman/listinfo/jetty-users

Reply via email to