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