Skip to content

Commit 213245e

Browse files
committed
add download
1 parent 35e0c00 commit 213245e

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

spec/CloudCode.spec.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3531,8 +3531,7 @@ describe('afterLogin hook', () => {
35313531
});
35323532

35333533
describe('saveFile hooks', () => {
3534-
fit('find hooks should run', async () => {
3535-
await reconfigureServer({ silent: false });
3534+
it('find hooks should run', async () => {
35363535
const file = new Parse.File('popeye.txt', [1, 2, 3], 'text/plain');
35373536
await file.save({ useMasterKey: true });
35383537
const user = await Parse.User.signUp('username', 'password');
@@ -3550,6 +3549,7 @@ describe('saveFile hooks', () => {
35503549
expect(req.triggerName).toBe('afterFind');
35513550
expect(req.master).toBeFalse();
35523551
expect(req.log).toBeDefined();
3552+
expect(req.forceDownload).toBeFalse();
35533553
},
35543554
};
35553555
for (const hook in hooks) {
@@ -3569,8 +3569,7 @@ describe('saveFile hooks', () => {
35693569
}
35703570
});
35713571

3572-
fit('beforeFind can throw', async () => {
3573-
await reconfigureServer({ silent: false });
3572+
it('beforeFind can throw', async () => {
35743573
const file = new Parse.File('popeye.txt', [1, 2, 3], 'text/plain');
35753574
await file.save({ useMasterKey: true });
35763575
const user = await Parse.User.signUp('username', 'password');
@@ -3601,8 +3600,7 @@ describe('saveFile hooks', () => {
36013600
expect(hooks.afterFind).not.toHaveBeenCalled();
36023601
});
36033602

3604-
fit('afterFind can throw', async () => {
3605-
await reconfigureServer({ silent: false });
3603+
it('afterFind can throw', async () => {
36063604
const file = new Parse.File('popeye.txt', [1, 2, 3], 'text/plain');
36073605
await file.save({ useMasterKey: true });
36083606
const user = await Parse.User.signUp('username', 'password');
@@ -3633,6 +3631,24 @@ describe('saveFile hooks', () => {
36333631
}
36343632
});
36353633

3634+
it('can force download', async () => {
3635+
const file = new Parse.File('popeye.txt', [1, 2, 3], 'text/plain');
3636+
await file.save({ useMasterKey: true });
3637+
const user = await Parse.User.signUp('username', 'password');
3638+
Parse.Cloud.afterFind(Parse.File, req => {
3639+
req.forceDownload = true;
3640+
});
3641+
const response = await request({
3642+
url: file.url(),
3643+
headers: {
3644+
'X-Parse-Application-Id': 'test',
3645+
'X-Parse-REST-API-Key': 'rest',
3646+
'X-Parse-Session-Token': user.getSessionToken(),
3647+
},
3648+
});
3649+
expect(response.headers['content-disposition']).toBe(`attachment;filename=${file._name}`);
3650+
});
3651+
36363652
it('beforeSaveFile should return file that is already saved and not save anything to files adapter', async () => {
36373653
await reconfigureServer({ filesAdapter: mockAdapter });
36383654
const createFileSpy = spyOn(mockAdapter, 'createFile').and.callThrough();

src/Routers/FilesRouter.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ export class FilesRouter {
112112
file = new Parse.File(filename, { base64: data.toString('base64') }, contentType);
113113
const afterFind = await triggers.maybeRunFileTrigger(
114114
triggers.Types.afterFind,
115-
{ file },
115+
{ file, forceDownload: false },
116116
config,
117117
req.auth
118118
);
@@ -125,6 +125,9 @@ export class FilesRouter {
125125
res.status(200);
126126
res.set('Content-Type', contentType);
127127
res.set('Content-Length', data.length);
128+
if (afterFind.forceDownload) {
129+
res.set('Content-Disposition', `attachment;filename=${afterFind.file._name}`);
130+
}
128131
res.end(data);
129132
} catch (e) {
130133
const err = triggers.resolveError(e, {

src/triggers.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,9 @@ export async function maybeRunFileTrigger(triggerType, fileObject, config, auth)
10041004
return fileObject;
10051005
}
10061006
const result = await fileTrigger(request);
1007+
if (request.forceDownload) {
1008+
fileObject.forceDownload = true;
1009+
}
10071010
logTriggerSuccessBeforeHook(
10081011
triggerType,
10091012
'Parse.File',

0 commit comments

Comments
 (0)