[
https://issues.apache.org/jira/browse/IO-798?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gary D. Gregory resolved IO-798.
--------------------------------
Fix Version/s: 2.13.0
Resolution: Fixed
[~shaishapira]
Thank you for your report.
This is fixed in git master, please try it or a snapshot build from
https://repository.apache.org/content/repositories/snapshots/commons-io/commons-io/2.13.0-SNAPSHOT/
> DeferredFileOutputStream throws exception when system temp dir is a symlink
> ---------------------------------------------------------------------------
>
> Key: IO-798
> URL: https://issues.apache.org/jira/browse/IO-798
> Project: Commons IO
> Issue Type: Bug
> Components: Streams/Writers
> Affects Versions: 2.12.0
> Reporter: Shai Shapira
> Priority: Minor
> Fix For: 2.13.0
>
>
> We have some code that creates an org.apache.commons.fileupload.FileItem and
> writes to its OutputStream. This worked well until commons-io version 12 came
> out, then started to throw a FileAlreadyExistsException. After some
> investigation, this is what seems to be happening:
> Our FileItem (created by a DiskFileItemFactory) uses a
> DeferredFileOutputStream as its output stream. DeferredFileOutputStream uses
> the system temp folder to save the file if it gets too big. When saving the
> file, it wants to create any parent folders if they don't already exist.
> The problem is, the logic for creating the parent folders seems to have been
> rewritten for version 2.12.0, and now calls:
> PathUtils.createParentDirectories({color:#9876aa}outputPath{color}){color:#cc7832};
> _{color:#172b4d}(DeferredFileOutputStream.java, line 333){color}_{color}
> {color:#172b4d}This method, by default, uses a parameter telling it not to
> follow links. On our servers, the temp folder is, unfortunately, a link. So
> the method looks at the folder in the file path, and sees the link. Since it
> does not follow links, it just sees that something other than a directory
> exists in this path, and throws an Exception.
> {color}
> The code looks something like this:
> FileItemFactory fileFact = {color:#cc7832}new
> {color}DiskFileItemFactory(){color:#cc7832};
> {color}FileItem file = fileFact.createItem(fieldName{color:#cc7832},
> {color}contentType{color:#cc7832}, {color}{color:#cc7832}false,
> {color}fileName){color:#cc7832};
> {color}{color:#cc7832}try {color}(OutputStream out = file.getOutputStream()) {
> {color:#cc7832}{color:#172b4d}<code that writes into{color}
> {_}out{_}{color:#172b4d}>{color}
> {color}}
>
> And the stack trace:
> java.nio.file.FileAlreadyExistsException: /usr/local/apache-tomcat-base/temp
> at
>
> java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:94)
> at
>
> java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
> at
>
> java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
> at
>
> java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:389)
> at
> java.base/java.nio.file.Files.createDirectory(Files.java:690) at
> java.base/java.nio.file.Files.createAndCheckIsDirectory(Files.java:797) at
> java.base/java.nio.file.Files.createDirectories(Files.java:743) at
>
> org.apache.commons.io.file.PathUtils.createParentDirectories(PathUtils.java:383)
> at
>
> org.apache.commons.io.file.PathUtils.createParentDirectories(PathUtils.java:367)
> at
>
> org.apache.commons.io.output.DeferredFileOutputStream.thresholdReached(DeferredFileOutputStream.java:333)
> at
>
> org.apache.commons.io.output.ThresholdingOutputStream.checkThreshold(ThresholdingOutputStream.java:105)
> at
>
> org.apache.commons.io.output.ThresholdingOutputStream.write(ThresholdingOutputStream.java:231)
> at
--
This message was sent by Atlassian Jira
(v8.20.10#820010)