mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-11-22 07:30:24 +00:00
Check file transfer input before writing
This commit is contained in:
parent
43a512bb30
commit
9f232aa7d1
1 changed files with 66 additions and 54 deletions
|
@ -7,9 +7,7 @@ import io.xpipe.core.store.FileNames;
|
||||||
import io.xpipe.core.store.FilePath;
|
import io.xpipe.core.store.FilePath;
|
||||||
import io.xpipe.core.store.FileSystem;
|
import io.xpipe.core.store.FileSystem;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.*;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
@ -220,62 +218,76 @@ public class BrowserFileTransferOperation {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
InputStream inputStream = null;
|
transfer(sourceFile, targetFile, transferred, totalSize, start);
|
||||||
OutputStream outputStream = null;
|
|
||||||
try {
|
|
||||||
var fileSize = sourceFile.getFileSystem().getFileSize(sourceFile.getPath());
|
|
||||||
inputStream = sourceFile.getFileSystem().openInput(sourceFile.getPath());
|
|
||||||
outputStream = target.getFileSystem().openOutput(targetFile, fileSize);
|
|
||||||
transferFile(sourceFile, inputStream, outputStream, transferred, totalSize, start);
|
|
||||||
inputStream.transferTo(OutputStream.nullOutputStream());
|
|
||||||
} catch (Exception ex) {
|
|
||||||
// Mark progress as finished to reset any progress display
|
|
||||||
updateProgress(BrowserTransferProgress.finished(sourceFile.getName(), transferred.get()));
|
|
||||||
|
|
||||||
if (inputStream != null) {
|
|
||||||
try {
|
|
||||||
inputStream.close();
|
|
||||||
} catch (Exception om) {
|
|
||||||
// This is expected as the process control has to be killed
|
|
||||||
// When calling close, it will throw an exception when it has to kill
|
|
||||||
// ErrorEvent.fromThrowable(om).handle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (outputStream != null) {
|
|
||||||
try {
|
|
||||||
outputStream.close();
|
|
||||||
} catch (Exception om) {
|
|
||||||
// This is expected as the process control has to be killed
|
|
||||||
// When calling close, it will throw an exception when it has to kill
|
|
||||||
// ErrorEvent.fromThrowable(om).handle();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
|
|
||||||
Exception exception = null;
|
|
||||||
try {
|
|
||||||
inputStream.close();
|
|
||||||
} catch (Exception om) {
|
|
||||||
exception = om;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
outputStream.close();
|
|
||||||
} catch (Exception om) {
|
|
||||||
if (exception != null) {
|
|
||||||
ErrorEvent.fromThrowable(om).handle();
|
|
||||||
} else {
|
|
||||||
exception = om;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (exception != null) {
|
|
||||||
throw exception;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateProgress(BrowserTransferProgress.finished(source.getName(), totalSize.get()));
|
updateProgress(BrowserTransferProgress.finished(source.getName(), totalSize.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void transfer(FileSystem.FileEntry sourceFile, String targetFile, AtomicLong transferred, AtomicLong totalSize, Instant start) throws Exception {
|
||||||
|
InputStream inputStream = null;
|
||||||
|
OutputStream outputStream = null;
|
||||||
|
try {
|
||||||
|
var fileSize = sourceFile.getFileSystem().getFileSize(sourceFile.getPath());
|
||||||
|
inputStream = new BufferedInputStream(sourceFile.getFileSystem().openInput(sourceFile.getPath()), 1024);
|
||||||
|
inputStream.mark(1024);
|
||||||
|
var streamStart = new byte[1024];
|
||||||
|
var streamStartLength = inputStream.read(streamStart, 0, 1024);
|
||||||
|
if (streamStartLength < 1024) {
|
||||||
|
inputStream.close();
|
||||||
|
inputStream = new ByteArrayInputStream(streamStart);
|
||||||
|
} else {
|
||||||
|
inputStream.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
outputStream = target.getFileSystem().openOutput(targetFile, fileSize);
|
||||||
|
transferFile(sourceFile, inputStream, outputStream, transferred, totalSize, start);
|
||||||
|
inputStream.transferTo(OutputStream.nullOutputStream());
|
||||||
|
} catch (Exception ex) {
|
||||||
|
// Mark progress as finished to reset any progress display
|
||||||
|
updateProgress(BrowserTransferProgress.finished(sourceFile.getName(), transferred.get()));
|
||||||
|
|
||||||
|
if (inputStream != null) {
|
||||||
|
try {
|
||||||
|
inputStream.close();
|
||||||
|
} catch (Exception om) {
|
||||||
|
// This is expected as the process control has to be killed
|
||||||
|
// When calling close, it will throw an exception when it has to kill
|
||||||
|
// ErrorEvent.fromThrowable(om).handle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (outputStream != null) {
|
||||||
|
try {
|
||||||
|
outputStream.close();
|
||||||
|
} catch (Exception om) {
|
||||||
|
// This is expected as the process control has to be killed
|
||||||
|
// When calling close, it will throw an exception when it has to kill
|
||||||
|
// ErrorEvent.fromThrowable(om).handle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
Exception exception = null;
|
||||||
|
try {
|
||||||
|
inputStream.close();
|
||||||
|
} catch (Exception om) {
|
||||||
|
exception = om;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
outputStream.close();
|
||||||
|
} catch (Exception om) {
|
||||||
|
if (exception != null) {
|
||||||
|
ErrorEvent.fromThrowable(om).handle();
|
||||||
|
} else {
|
||||||
|
exception = om;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (exception != null) {
|
||||||
|
throw exception;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void deleteSingle(FileSystem.FileEntry source) throws Exception {
|
private void deleteSingle(FileSystem.FileEntry source) throws Exception {
|
||||||
source.getFileSystem().delete(source.getPath());
|
source.getFileSystem().delete(source.getPath());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue