mirror of
https://github.com/directus/directus.git
synced 2026-01-29 16:28:02 -05:00
Add upload (replace) / update file
This commit is contained in:
@@ -4,14 +4,11 @@ import Busboy from 'busboy';
|
||||
import sanitizeQuery from '../middleware/sanitize-query';
|
||||
import validateQuery from '../middleware/validate-query';
|
||||
import * as FilesService from '../services/files';
|
||||
import storage from '../storage';
|
||||
import { Readable } from 'stream';
|
||||
import logger from '../logger';
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.post(
|
||||
'/',
|
||||
const multipartHandler = (operation: 'create' | 'update') =>
|
||||
asyncHandler(async (req, res, next) => {
|
||||
const busboy = new Busboy({ headers: req.headers });
|
||||
|
||||
@@ -50,7 +47,11 @@ router.post(
|
||||
});
|
||||
|
||||
try {
|
||||
await FilesService.createFile(fileStream, payload);
|
||||
if (operation === 'create') {
|
||||
await FilesService.createFile(payload, fileStream);
|
||||
} else {
|
||||
await FilesService.updateFile(req.params.pk, payload, fileStream);
|
||||
}
|
||||
} catch (err) {
|
||||
busboy.emit('error', err);
|
||||
}
|
||||
@@ -65,8 +66,9 @@ router.post(
|
||||
});
|
||||
|
||||
return req.pipe(busboy);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
router.post('/', multipartHandler('create'));
|
||||
|
||||
router.get(
|
||||
'/',
|
||||
@@ -90,9 +92,14 @@ router.get(
|
||||
|
||||
router.patch(
|
||||
'/:pk',
|
||||
asyncHandler(async (req, res) => {
|
||||
const records = await FilesService.updateFile(req.params.pk, req.body, res.locals.query);
|
||||
return res.json({ data: records });
|
||||
asyncHandler(async (req, res, next) => {
|
||||
if (req.is('multipart/form-data')) {
|
||||
await multipartHandler('update')(req, res, next);
|
||||
} else {
|
||||
await FilesService.updateFile(req.params.pk, req.body);
|
||||
}
|
||||
|
||||
return res.status(200).end();
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ import database from '../database';
|
||||
import logger from '../logger';
|
||||
|
||||
export const createFile = async (
|
||||
stream: NodeJS.ReadableStream,
|
||||
data: Record<string, any>,
|
||||
stream: NodeJS.ReadableStream,
|
||||
query?: Query
|
||||
) => {
|
||||
const payload = await PayloadService.processValues('create', 'directus_files', data);
|
||||
@@ -26,8 +26,31 @@ export const readFile = async (pk: string | number, query: Query) => {
|
||||
return await ItemsService.readItem('directus_files', pk, query);
|
||||
};
|
||||
|
||||
export const updateFile = async (pk: string | number, data: Record<string, any>, query: Query) => {
|
||||
return await ItemsService.updateItem('directus_files', pk, data, query);
|
||||
// @todo Add query support
|
||||
export const updateFile = async (
|
||||
pk: string | number,
|
||||
data: Record<string, any>,
|
||||
stream?: NodeJS.ReadableStream,
|
||||
query?: Query
|
||||
) => {
|
||||
const payload = await PayloadService.processValues('update', 'directus_files', data);
|
||||
await ItemsService.updateItem('directus_files', pk, payload, query);
|
||||
|
||||
/**
|
||||
* @TODO
|
||||
* Handle changes in storage adapter -> going from local to S3 needs to delete from one, upload to the other
|
||||
*/
|
||||
|
||||
if (stream) {
|
||||
const file = await database
|
||||
.select('storage', 'filename_disk')
|
||||
.from('directus_files')
|
||||
.where({ id: pk })
|
||||
.first();
|
||||
|
||||
// @todo type of stream in flydrive is wrong: https://github.com/Slynova-Org/flydrive/issues/145
|
||||
await storage.disk(file.storage).put(file.filename_disk, stream as any);
|
||||
}
|
||||
};
|
||||
|
||||
export const deleteFile = async (pk: string | number) => {
|
||||
|
||||
@@ -11,7 +11,6 @@ import { GoogleCloudStorage } from '@slynova/flydrive-gcs';
|
||||
|
||||
/** @todo dynamically load storage adapters here */
|
||||
|
||||
console.log(getStorageConfig());
|
||||
const storage = new StorageManager(getStorageConfig());
|
||||
|
||||
registerDrivers(storage);
|
||||
|
||||
Reference in New Issue
Block a user