处理windows合并文件异常问题
This commit is contained in:
parent
4110687e02
commit
b90c695207
@ -1,4 +1,4 @@
|
||||
import { type DataConnection } from "peerjs";
|
||||
import type { DataConnection } from "peerjs";
|
||||
import { FileTransfer, TransferStatus, TransferTask } from "./fileTransfer";
|
||||
import { peer } from "./peer";
|
||||
import { MessageType } from "./peer";
|
||||
@ -327,14 +327,12 @@ export class FileInfo {
|
||||
}
|
||||
if (offset > 0) {
|
||||
const fileHandler = await dir.getFileHandle(name, { create: true });
|
||||
const arrayBuffer = await (await fileHandler.getFile()).arrayBuffer();
|
||||
const newSize = buffer.byteLength + offset;
|
||||
const newArrayBuffer = arrayBuffer.byteLength >= newSize ? new Uint8Array(arrayBuffer.byteLength) : new Uint8Array(newSize);
|
||||
newArrayBuffer.set(new Uint8Array(arrayBuffer), 0);
|
||||
newArrayBuffer.set(new Uint8Array(buffer), offset);
|
||||
|
||||
const writable = await fileHandler.createWritable();
|
||||
await writable.write(newArrayBuffer);
|
||||
const writable = await fileHandler.createWritable({ keepExistingData: true });
|
||||
await writable.write({
|
||||
type: 'write',
|
||||
position: offset,
|
||||
data: buffer,
|
||||
});
|
||||
await writable.close();
|
||||
} else {
|
||||
|
||||
@ -365,15 +363,12 @@ export class FileInfo {
|
||||
})
|
||||
} else {
|
||||
if (offset > 0) {
|
||||
const file = await (this.fileDirHandler as FileSystemFileHandle).getFile();
|
||||
const arrayBuffer = await file.arrayBuffer();
|
||||
const newSize = buffer.byteLength + offset;
|
||||
const newArrayBuffer = arrayBuffer.byteLength >= newSize ? new Uint8Array(arrayBuffer.byteLength) : new Uint8Array(newSize);
|
||||
newArrayBuffer.set(new Uint8Array(arrayBuffer), 0);
|
||||
newArrayBuffer.set(new Uint8Array(buffer), offset);
|
||||
|
||||
const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable();
|
||||
await writable.write(newArrayBuffer);
|
||||
const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable({ keepExistingData: true });
|
||||
await writable.write({
|
||||
type: 'write',
|
||||
position: offset,
|
||||
data: buffer,
|
||||
});
|
||||
await writable.close();
|
||||
} else {
|
||||
const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable();
|
||||
|
||||
@ -80,6 +80,7 @@ export class FileTransfer {
|
||||
this.pausePromise = undefined;
|
||||
this.pauseResolve = undefined;
|
||||
this.aborted = false;
|
||||
this.receiveQueue = Promise.resolve();
|
||||
}
|
||||
|
||||
// 设置进度回调
|
||||
@ -117,6 +118,7 @@ export class FileTransfer {
|
||||
public offset: number = 0;
|
||||
public totalSize: number = 0;
|
||||
private fileBuffer: ArrayBuffer | null = null;
|
||||
private receiveQueue: Promise<void> = Promise.resolve();
|
||||
private async waitForWritable(targetBufferedAmount = MAX_BUFFERED_AMOUNT) {
|
||||
const dc = this.conn.dataChannel;
|
||||
if (!dc) {
|
||||
@ -222,6 +224,17 @@ export class FileTransfer {
|
||||
public async receiveFile(
|
||||
fData: FileData,
|
||||
preView: boolean = false,
|
||||
): Promise<void> {
|
||||
this.receiveQueue = this.receiveQueue.then(
|
||||
() => this.receiveFileChunk(fData, preView),
|
||||
() => this.receiveFileChunk(fData, preView),
|
||||
);
|
||||
return this.receiveQueue;
|
||||
}
|
||||
|
||||
private async receiveFileChunk(
|
||||
fData: FileData,
|
||||
preView: boolean = false,
|
||||
): Promise<void> {
|
||||
try {
|
||||
let task = this.getTask(fData);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user