You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/06/06 15:58:44 UTC
[commons-fileupload] 02/02: Switch some code from IO to NIO
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-fileupload.git
commit 6d07bb6070acb41504ec934ed690a0aaf86b43bb
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Jun 6 11:58:37 2023 -0400
Switch some code from IO to NIO
---
.../org/apache/commons/fileupload2/FileItem.java | 4 +-
.../commons/fileupload2/disk/DiskFileItem.java | 44 +++++++++++-----------
.../fileupload2/DiskFileItemSerializeTest.java | 25 ++++++++----
3 files changed, 42 insertions(+), 31 deletions(-)
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItem.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItem.java
index 9548186..d20a2cc 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItem.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/FileItem.java
@@ -16,12 +16,12 @@
*/
package org.apache.commons.fileupload2;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UncheckedIOException;
import java.io.UnsupportedEncodingException;
+import java.nio.file.Path;
/**
* <p>
@@ -168,6 +168,6 @@ public interface FileItem extends FileItemHeadersSupport {
* @param file The {@code File} into which the uploaded item should be stored.
* @throws IOException if an error occurs.
*/
- void write(File file) throws IOException;
+ void write(Path file) throws IOException;
}
diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItem.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItem.java
index e3a13b5..020ccf9 100644
--- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItem.java
+++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/disk/DiskFileItem.java
@@ -17,7 +17,6 @@
package org.apache.commons.fileupload2.disk;
import java.io.ByteArrayInputStream;
-import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -26,8 +25,10 @@ import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.charset.UnsupportedCharsetException;
+import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
@@ -38,7 +39,6 @@ import org.apache.commons.fileupload2.FileUploadException;
import org.apache.commons.fileupload2.InvalidFileNameException;
import org.apache.commons.fileupload2.ParameterParser;
import org.apache.commons.io.Charsets;
-import org.apache.commons.io.FileUtils;
import org.apache.commons.io.file.PathUtils;
import org.apache.commons.io.function.Uncheck;
import org.apache.commons.io.output.DeferredFileOutputStream;
@@ -212,10 +212,13 @@ public class DiskFileItem implements FileItem {
@Override
public void delete() {
cachedContent = null;
- final File outputFile = getStoreLocation();
- if (outputFile != null && !isInMemory() && outputFile.exists() && !outputFile.delete()) {
- final String desc = "Cannot delete " + outputFile.toString();
- throw new UncheckedIOException(desc, new IOException(desc));
+ final Path outputFile = getStoreLocation();
+ if (outputFile != null && !isInMemory() && Files.exists(outputFile)) {
+ try {
+ Files.delete(outputFile);
+ } catch (final IOException e) {
+ throw new UncheckedIOException(outputFile.toString(), e);
+ }
}
}
@@ -356,20 +359,20 @@ public class DiskFileItem implements FileItem {
}
/**
- * Gets the {@link java.io.File} object for the {@code FileItem}'s data's temporary location on the disk. Note that for {@code FileItem}s that have their
- * data stored in memory, this method will return {@code null}. When handling large files, you can use {@link java.io.File#renameTo(java.io.File)} to move
- * the file to new location without copying the data, if the source and destination locations reside within the same logical volume.
+ * Gets the {@link Path} for the {@code FileItem}'s data's temporary location on the disk. Note that for {@code FileItem}s that have their data stored in
+ * memory, this method will return {@code null}. When handling large files, you can use {@link Files#move(Path,Path,CopyOption...)} to move the file to new
+ * location without copying the data, if the source and destination locations reside within the same logical volume.
*
* @return The data file, or {@code null} if the data is stored in memory.
*/
- public File getStoreLocation() {
+ public Path getStoreLocation() {
if (dfos == null) {
return null;
}
if (isInMemory()) {
return null;
}
- return dfos.getFile();
+ return dfos.getFile().toPath();
}
/**
@@ -512,15 +515,15 @@ public class DiskFileItem implements FileItem {
* @throws IOException if an error occurs.
*/
@Override
- public void write(final File file) throws IOException {
+ public void write(final Path file) throws IOException {
if (isInMemory()) {
- try (OutputStream fout = Files.newOutputStream(file.toPath())) {
+ try (OutputStream fout = Files.newOutputStream(file)) {
fout.write(get());
} catch (final IOException e) {
throw new IOException("Unexpected output data", e);
}
} else {
- final File outputFile = getStoreLocation();
+ final Path outputFile = getStoreLocation();
if (outputFile == null) {
/*
* For whatever reason we cannot write the file to disk.
@@ -528,14 +531,11 @@ public class DiskFileItem implements FileItem {
throw new FileUploadException("Cannot write uploaded file to disk.");
}
// Save the length of the file
- size = outputFile.length();
- /*
- * The uploaded file is being stored on disk in a temporary location so move it to the desired file.
- */
- if (file.exists() && !file.delete()) {
- throw new FileUploadException("Cannot write uploaded file to disk.");
- }
- FileUtils.moveFile(outputFile, file);
+ size = Files.size(outputFile);
+ //
+ // The uploaded file is being stored on disk in a temporary location so move it to the desired file.
+ //
+ Files.move(outputFile, file, StandardCopyOption.REPLACE_EXISTING);
}
}
}
diff --git a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/DiskFileItemSerializeTest.java b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/DiskFileItemSerializeTest.java
index 313a7cf..f736c02 100644
--- a/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/DiskFileItemSerializeTest.java
+++ b/commons-fileupload2-core/src/test/java/org/apache/commons/fileupload2/DiskFileItemSerializeTest.java
@@ -27,12 +27,15 @@ import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
+import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
import org.apache.commons.fileupload2.disk.DiskFileItemFactory;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.file.PathUtils;
+import org.apache.commons.io.file.SimplePathVisitor;
import org.apache.commons.lang3.SerializationUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -43,7 +46,9 @@ import org.junit.jupiter.api.Test;
*/
public class DiskFileItemSerializeTest {
- // Use a private repository to catch any files left over by tests
+ /**
+ * Use a private repository to catch any files left over by tests.
+ */
private static final Path REPOSITORY = PathUtils.getTempDirectory().resolve("DiskFileItemRepo");
/**
@@ -135,11 +140,17 @@ public class DiskFileItemSerializeTest {
@AfterEach
public void tearDown() throws IOException {
-
- for (final File file : FileUtils.listFiles(REPOSITORY.toFile(), null, true)) {
- System.out.println("Found leftover file " + file);
+ if (Files.exists(REPOSITORY)) {
+ PathUtils.visitFileTree(new SimplePathVisitor() {
+ @Override
+ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
+ System.out.println("Found leftover file " + file);
+ return FileVisitResult.CONTINUE;
+ }
+
+ }, REPOSITORY);
+ PathUtils.deleteDirectory(REPOSITORY);
}
- PathUtils.deleteDirectory(REPOSITORY);
}
/**
@@ -227,10 +238,10 @@ public class DiskFileItemSerializeTest {
* Helper method to test writing item contents to a file.
*/
public void testWritingToFile(final FileItem item, final byte[] testFieldValueBytes) throws IOException {
- final File temp = File.createTempFile("fileupload", null);
+ final Path temp = Files.createTempFile("fileupload", null);
// Note that the file exists and is initially empty;
// write() must be able to handle that.
item.write(temp);
- compareBytes("Initial", FileUtils.readFileToByteArray(temp), testFieldValueBytes);
+ compareBytes("Initial", Files.readAllBytes(temp), testFieldValueBytes);
}
}