Merge branch '5.3.x'
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -20,6 +20,8 @@ import java.io.IOException;
|
||||
import java.nio.channels.Channel;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
@@ -110,6 +112,14 @@ abstract class MultipartUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void deleteFile(Path file) {
|
||||
try {
|
||||
Files.delete(file);
|
||||
}
|
||||
catch (IOException ignore) {
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isFormField(HttpHeaders headers) {
|
||||
MediaType contentType = headers.getContentType();
|
||||
return (contentType == null || MediaType.TEXT_PLAIN.equalsTypeAndSubtype(contentType))
|
||||
|
||||
@@ -555,6 +555,7 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
}
|
||||
else {
|
||||
MultipartUtils.closeChannel(newState.channel);
|
||||
MultipartUtils.deleteFile(newState.file);
|
||||
this.content.forEach(DataBufferUtils::release);
|
||||
}
|
||||
}
|
||||
@@ -586,6 +587,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
|
||||
private volatile boolean closeOnDispose = true;
|
||||
|
||||
private volatile boolean deleteOnDispose = true;
|
||||
|
||||
|
||||
public IdleFileState(WritingFileState state) {
|
||||
this.headers = state.headers;
|
||||
@@ -600,16 +603,20 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
if (PartGenerator.this.maxDiskUsagePerPart == -1 || count <= PartGenerator.this.maxDiskUsagePerPart) {
|
||||
|
||||
this.closeOnDispose = false;
|
||||
this.deleteOnDispose = false;
|
||||
WritingFileState newState = new WritingFileState(this);
|
||||
if (changeState(this, newState)) {
|
||||
newState.writeBuffer(dataBuffer);
|
||||
}
|
||||
else {
|
||||
MultipartUtils.closeChannel(this.channel);
|
||||
MultipartUtils.deleteFile(this.file);
|
||||
DataBufferUtils.release(dataBuffer);
|
||||
}
|
||||
}
|
||||
else {
|
||||
MultipartUtils.closeChannel(this.channel);
|
||||
MultipartUtils.deleteFile(this.file);
|
||||
DataBufferUtils.release(dataBuffer);
|
||||
emitError(new DataBufferLimitException(
|
||||
"Part exceeded the disk usage limit of " + PartGenerator.this.maxDiskUsagePerPart +
|
||||
@@ -620,6 +627,7 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
@Override
|
||||
public void onComplete() {
|
||||
MultipartUtils.closeChannel(this.channel);
|
||||
this.deleteOnDispose = false;
|
||||
emitPart(DefaultParts.part(this.headers, this.file, PartGenerator.this.blockingOperationScheduler));
|
||||
}
|
||||
|
||||
@@ -628,6 +636,9 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
if (this.closeOnDispose) {
|
||||
MultipartUtils.closeChannel(this.channel);
|
||||
}
|
||||
if (this.deleteOnDispose) {
|
||||
MultipartUtils.deleteFile(this.file);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -651,6 +662,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
|
||||
private volatile boolean completed;
|
||||
|
||||
private volatile boolean disposed;
|
||||
|
||||
|
||||
public WritingFileState(CreateFileState state, Path file, WritableByteChannel channel) {
|
||||
this.headers = state.headers;
|
||||
@@ -701,11 +714,15 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
if (this.completed) {
|
||||
newState.onComplete();
|
||||
}
|
||||
else if (this.disposed) {
|
||||
newState.dispose();
|
||||
}
|
||||
else if (changeState(this, newState)) {
|
||||
requestToken();
|
||||
}
|
||||
else {
|
||||
MultipartUtils.closeChannel(this.channel);
|
||||
MultipartUtils.deleteFile(this.file);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -719,6 +736,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
return Mono.empty();
|
||||
}
|
||||
catch (IOException ex) {
|
||||
MultipartUtils.closeChannel(this.channel);
|
||||
MultipartUtils.deleteFile(this.file);
|
||||
return Mono.error(ex);
|
||||
}
|
||||
finally {
|
||||
@@ -726,6 +745,12 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
this.disposed = true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "WRITE-FILE";
|
||||
|
||||
Reference in New Issue
Block a user