@@ -555,6 +555,7 @@ private void fileCreated(WritingFileState newState) {
555
555
}
556
556
else {
557
557
MultipartUtils .closeChannel (newState .channel );
558
+ MultipartUtils .deleteFile (newState .file );
558
559
this .content .forEach (DataBufferUtils ::release );
559
560
}
560
561
}
@@ -586,6 +587,8 @@ private final class IdleFileState implements State {
586
587
587
588
private volatile boolean closeOnDispose = true ;
588
589
590
+ private volatile boolean deleteOnDispose = true ;
591
+
589
592
590
593
public IdleFileState (WritingFileState state ) {
591
594
this .headers = state .headers ;
@@ -600,16 +603,20 @@ public void body(DataBuffer dataBuffer) {
600
603
if (PartGenerator .this .maxDiskUsagePerPart == -1 || count <= PartGenerator .this .maxDiskUsagePerPart ) {
601
604
602
605
this .closeOnDispose = false ;
606
+ this .deleteOnDispose = false ;
603
607
WritingFileState newState = new WritingFileState (this );
604
608
if (changeState (this , newState )) {
605
609
newState .writeBuffer (dataBuffer );
606
610
}
607
611
else {
608
612
MultipartUtils .closeChannel (this .channel );
613
+ MultipartUtils .deleteFile (this .file );
609
614
DataBufferUtils .release (dataBuffer );
610
615
}
611
616
}
612
617
else {
618
+ MultipartUtils .closeChannel (this .channel );
619
+ MultipartUtils .deleteFile (this .file );
613
620
DataBufferUtils .release (dataBuffer );
614
621
emitError (new DataBufferLimitException (
615
622
"Part exceeded the disk usage limit of " + PartGenerator .this .maxDiskUsagePerPart +
@@ -620,6 +627,7 @@ public void body(DataBuffer dataBuffer) {
620
627
@ Override
621
628
public void onComplete () {
622
629
MultipartUtils .closeChannel (this .channel );
630
+ this .deleteOnDispose = false ;
623
631
emitPart (DefaultParts .part (this .headers , this .file , PartGenerator .this .blockingOperationScheduler ));
624
632
}
625
633
@@ -628,6 +636,9 @@ public void dispose() {
628
636
if (this .closeOnDispose ) {
629
637
MultipartUtils .closeChannel (this .channel );
630
638
}
639
+ if (this .deleteOnDispose ) {
640
+ MultipartUtils .deleteFile (this .file );
641
+ }
631
642
}
632
643
633
644
@@ -651,6 +662,8 @@ private final class WritingFileState implements State {
651
662
652
663
private volatile boolean completed ;
653
664
665
+ private volatile boolean disposed ;
666
+
654
667
655
668
public WritingFileState (CreateFileState state , Path file , WritableByteChannel channel ) {
656
669
this .headers = state .headers ;
@@ -701,11 +714,15 @@ private void writeComplete() {
701
714
if (this .completed ) {
702
715
newState .onComplete ();
703
716
}
717
+ else if (this .disposed ) {
718
+ newState .dispose ();
719
+ }
704
720
else if (changeState (this , newState )) {
705
721
requestToken ();
706
722
}
707
723
else {
708
724
MultipartUtils .closeChannel (this .channel );
725
+ MultipartUtils .deleteFile (this .file );
709
726
}
710
727
}
711
728
@@ -719,13 +736,21 @@ private Mono<Void> writeInternal(DataBuffer dataBuffer) {
719
736
return Mono .empty ();
720
737
}
721
738
catch (IOException ex ) {
739
+ MultipartUtils .closeChannel (this .channel );
740
+ MultipartUtils .deleteFile (this .file );
722
741
return Mono .error (ex );
723
742
}
724
743
finally {
725
744
DataBufferUtils .release (dataBuffer );
726
745
}
727
746
}
728
747
748
+ @ Override
749
+ public void dispose () {
750
+ this .disposed = true ;
751
+ }
752
+
753
+
729
754
@ Override
730
755
public String toString () {
731
756
return "WRITE-FILE" ;
0 commit comments