diff --git a/packages/client/lib/files.js b/packages/client/lib/files.js index c8413ab4..6b15d9e5 100644 --- a/packages/client/lib/files.js +++ b/packages/client/lib/files.js @@ -35,6 +35,7 @@ class Files { const requestType = 'stream' const params = {} if (metadata) params.metadata = JSON.stringify(metadata) + return await this.collection.fetch('/file', { method: 'POST', body: stream, @@ -81,7 +82,8 @@ class Files { if (opts.range) { opts.headers.Range = `bytes=${opts.range.from || 0}-${opts.range.to || ''}` } - return this.collection.fetch('/file/' + id, opts) + const query = opts.query || '' + return this.collection.fetch('/file/' + id + query, opts) } /** diff --git a/packages/core/lib/file.js b/packages/core/lib/file.js index 1442d18c..25fc7792 100644 --- a/packages/core/lib/file.js +++ b/packages/core/lib/file.js @@ -120,7 +120,7 @@ module.exports = class Files { if (method === 'HEAD') return new EmptyStream() const readStream = hyperdrive.createReadStream(path, range) - return { stream: readStream, headers: responseHeaders, statusCode } + return { stream: readStream, headers: responseHeaders, statusCode, record } } async resolveFile (id) { diff --git a/packages/server/handlers/collection.js b/packages/server/handlers/collection.js index 214cddc5..1f45672a 100644 --- a/packages/server/handlers/collection.js +++ b/packages/server/handlers/collection.js @@ -342,9 +342,9 @@ module.exports = function createCollectionRoutes () { '/:collection/file', AH(async function (req, res, next) { let metadata = {} - if (req.params.metadata) { + if (req.query.metadata) { try { - metadata = JSON.parse(req.params.metadata) + metadata = JSON.parse(req.query.metadata) if (typeof metadata !== 'object' || Array.isArray(metadata)) { throw new Error('Metadata has to be a JSON object') } @@ -360,18 +360,27 @@ module.exports = function createCollectionRoutes () { router.get( '/:collection/file/:id', AH(async function (req, res, next) { - if (req.query.meta) { + const query = req.query + if (query.meta) { const record = await req.collection.files.getRecord(req.params.id) return res.json(record) } const { headers, stream, - statusCode + statusCode, + record } = await req.collection.files.readFileWithHeaders(req.params.id, req) for (const [name, value] of Object.entries(headers)) { res.setHeader(name, value) } + + if (query.dl) { + const filename = record.value.filename || record.id + res.setHeader('Content-Disposition', `attachment; filename="${filename}"`) + } else { + res.setHeader('Content-Disposition', 'inline') + } res.status(statusCode) pipeline(stream, res, err => {