Skip to content
This repository was archived by the owner on Dec 1, 2025. It is now read-only.

Commit 500c9e9

Browse files
authored
Merge pull request #68 from suilyy/sig
fix: 解决文件重定向/加载多张重复文件报错/通知栏下载消息的问题
2 parents 7037b90 + 2c04ed9 commit 500c9e9

1 file changed

Lines changed: 43 additions & 4 deletions

File tree

harmony/pdfview/src/main/ets/components/mainpage/RTNPdfView.ets

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export interface PdfViewState {}
4040

4141
interface Source {
4242
uri: string;
43-
headers?: Object;
43+
headers?: Record<string, Object>;
4444
cache?: boolean;
4545
cacheFileName?: string;
4646
expiration?: number;
@@ -197,6 +197,20 @@ export struct RTNPdfView {
197197
if (fs.accessSync(fullFileName)) {
198198
fs.unlinkSync(fullFileName);
199199
}
200+
const res = await this.downloadAction(context, url, fullFileName, {}, 0);
201+
Logger.info(`[RTNPdfView]:res: ${res}`);
202+
return res;
203+
}
204+
async downloadAction(
205+
context: Context,
206+
url: string,
207+
fullFileName: string,
208+
distHeaders: Record<string, Object>,
209+
redirectCount: number = 0,
210+
): Promise<string> {
211+
if (redirectCount > 5) {
212+
throw new Error("Too many redirects");
213+
}
200214
return new Promise((resolve, reject) => {
201215
// 获取应用文件路径
202216
try {
@@ -205,9 +219,10 @@ export struct RTNPdfView {
205219
action: request.agent.Action.DOWNLOAD,
206220
url,
207221
method: this.descriptor.rawProps.source.method ?? 'GET',
208-
headers: this.descriptor.rawProps.source.headers,
222+
headers: assignHeader(this.descriptor.rawProps.source?.headers || {}, distHeaders|| {}),
209223
saveas: fullFileName,
210224
overwrite: true,
225+
mode: request.agent.Mode.FOREGROUND
211226
};
212227
request.agent.create(context, config).then((task: request.agent.Task) => {
213228
task.on('completed', () => {
@@ -217,8 +232,24 @@ export struct RTNPdfView {
217232
task.on('failed', (progress: request.agent.Progress) => {
218233
console.info('[RTNPdfView]: downloadFile failed.', JSON.stringify(progress));
219234
});
220-
task.on('response', (response: request.agent.HttpResponse) => {
235+
task.on('response', async (response: request.agent.HttpResponse) => {
221236
console.info('[RTNPdfView]: downloadFile response.', JSON.stringify(response));
237+
if (response.statusCode > 300 && response.statusCode < 400) {
238+
let redirectUrl: string = response.headers.get('location')?.toString() ?? '';
239+
let cookie: string = response.headers.get('set-cookie')?.toString() ?? '';
240+
task.off('progress');
241+
task.off('completed');
242+
task.off('response');
243+
task.stop();
244+
try {
245+
const result = await this.downloadAction(context, redirectUrl, fullFileName, { 'cookie': cookie }, redirectCount + 1);
246+
247+
Logger.info(`[RTNPdfView]:result: ${result} -----count: ${redirectCount}}`);
248+
resolve(result)
249+
} catch (e) {
250+
reject(e);
251+
}
252+
}
222253
});
223254
task.start();
224255
}).catch((err: BusinessError) => {
@@ -242,7 +273,7 @@ export struct RTNPdfView {
242273
try {
243274
await md.update({ data: new Uint8Array(buffer.from(originalURL, 'utf-8').buffer) });
244275
let mdResult: cryptoFramework.DataBlob = await md.digest();
245-
const fileName: string = buffer.from(mdResult.data).toString('hex');
276+
const fileName: string = buffer.from(mdResult.data).toString('hex') + new Date().getTime();
246277
Logger.info(`[RTNPdfView]: fileName: ${fileName}`);
247278
resolve(fileName);
248279
} catch (e) {
@@ -410,4 +441,12 @@ export struct RTNPdfView {
410441
}
411442
}
412443
}
444+
}
445+
function assignHeader(target: Record<string, Object>, ...source: Record<string, Object>[]): Record<string, Object> {
446+
for(let s of source){
447+
for(let k of Object.keys(s)){
448+
target[k] = Reflect.get(s, k)
449+
}
450+
}
451+
return target
413452
}

0 commit comments

Comments
 (0)