feat: add more mimetypes!
This commit is contained in:
parent
95e09e51e1
commit
04ca738fb1
6 changed files with 8321 additions and 86 deletions
|
@ -27,7 +27,7 @@ COPY --from=deps /build/node_modules ./node_modules
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
COPY prisma ./prisma
|
COPY prisma ./prisma
|
||||||
COPY .yarn .yarn
|
COPY .yarn .yarn
|
||||||
COPY package.json yarn.lock .yarnrc.yml esbuild.config.js next.config.js next-env.d.ts zip-env.d.ts tsconfig.json ./
|
COPY package.json yarn.lock .yarnrc.yml esbuild.config.js next.config.js next-env.d.ts zip-env.d.ts tsconfig.json mimes.json ./
|
||||||
|
|
||||||
ENV ZIPLINE_DOCKER_BUILD 1
|
ENV ZIPLINE_DOCKER_BUILD 1
|
||||||
ENV NEXT_TELEMETRY_DISABLED 1
|
ENV NEXT_TELEMETRY_DISABLED 1
|
||||||
|
@ -59,5 +59,6 @@ COPY --from=builder /build/src ./src
|
||||||
COPY --from=builder /build/prisma ./prisma
|
COPY --from=builder /build/prisma ./prisma
|
||||||
COPY --from=builder /build/tsconfig.json ./tsconfig.json
|
COPY --from=builder /build/tsconfig.json ./tsconfig.json
|
||||||
COPY --from=builder /build/package.json ./package.json
|
COPY --from=builder /build/package.json ./package.json
|
||||||
|
COPY --from=builder /build/mimes.json ./mimes.json
|
||||||
|
|
||||||
CMD ["node", "dist/server"]
|
CMD ["node", "dist/server"]
|
|
@ -24,7 +24,7 @@ services:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
- CORE_HTTPS=false
|
- CORE_HTTPS=false
|
||||||
- CORE_SECRET=changethis
|
- CORE_SECRET=changethislol
|
||||||
- CORE_HOST=0.0.0.0
|
- CORE_HOST=0.0.0.0
|
||||||
- CORE_PORT=3000
|
- CORE_PORT=3000
|
||||||
- CORE_DATABASE_URL=postgres://postgres:postgres@postgres/postgres
|
- CORE_DATABASE_URL=postgres://postgres:postgres@postgres/postgres
|
||||||
|
|
8298
mimes.json
Normal file
8298
mimes.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1,80 +1,12 @@
|
||||||
const mimes = {
|
import { readFile } from 'fs/promises';
|
||||||
'.aac': 'audio/aac',
|
|
||||||
'.abw': 'application/x-abiword',
|
|
||||||
'.arc': 'application/x-freearc',
|
|
||||||
'.avi': 'video/x-msvideo',
|
|
||||||
'.azw': 'application/vnd.amazon.ebook',
|
|
||||||
'.bin': 'application/octet-stream',
|
|
||||||
'.bmp': 'image/bmp',
|
|
||||||
'.bz': 'application/x-bzip',
|
|
||||||
'.bz2': 'application/x-bzip2',
|
|
||||||
'.cda': 'application/x-cdf',
|
|
||||||
'.csh': 'application/x-csh',
|
|
||||||
'.css': 'text/css',
|
|
||||||
'.csv': 'text/csv',
|
|
||||||
'.doc': 'application/msword',
|
|
||||||
'.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
||||||
'.eot': 'application/vnd.ms-fontobject',
|
|
||||||
'.epub': 'application/epub+zip',
|
|
||||||
'.gz': 'application/gzip',
|
|
||||||
'.gif': 'image/gif',
|
|
||||||
'.htm': 'text/html',
|
|
||||||
'.html': 'text/html',
|
|
||||||
'.ico': 'image/vnd.microsoft.icon',
|
|
||||||
'.ics': 'text/calendar',
|
|
||||||
'.jar': 'application/java-archive',
|
|
||||||
'.jpeg': 'image/jpeg',
|
|
||||||
'.jpg': 'image/jpeg',
|
|
||||||
'.js': 'text/javascript',
|
|
||||||
'.json': 'application/json',
|
|
||||||
'.jsonld': 'application/ld+json',
|
|
||||||
'.mid': 'audio/midi',
|
|
||||||
'.midi': 'audio/midi',
|
|
||||||
'.mjs': 'text/javascript',
|
|
||||||
'.mp3': 'audio/mpeg',
|
|
||||||
'.mp4': 'video/mp4',
|
|
||||||
'.mpeg': 'video/mpeg',
|
|
||||||
'.mpkg': 'application/vnd.apple.installer+xml',
|
|
||||||
'.odp': 'application/vnd.oasis.opendocument.presentation',
|
|
||||||
'.ods': 'application/vnd.oasis.opendocument.spreadsheet',
|
|
||||||
'.odt': 'application/vnd.oasis.opendocument.text',
|
|
||||||
'.oga': 'audio/ogg',
|
|
||||||
'.ogv': 'video/ogg',
|
|
||||||
'.ogx': 'application/ogg',
|
|
||||||
'.opus': 'audio/opus',
|
|
||||||
'.otf': 'font/otf',
|
|
||||||
'.png': 'image/png',
|
|
||||||
'.pdf': 'application/pdf',
|
|
||||||
'.php': 'application/x-httpd-php',
|
|
||||||
'.ppt': 'application/vnd.ms-powerpoint',
|
|
||||||
'.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
||||||
'.rar': 'application/vnd.rar',
|
|
||||||
'.rtf': 'application/rtf',
|
|
||||||
'.sh': 'application/x-sh',
|
|
||||||
'.svg': 'image/svg+xml',
|
|
||||||
'.swf': 'application/x-shockwave-flash',
|
|
||||||
'.tar': 'application/x-tar',
|
|
||||||
'.tif': 'image/tiff',
|
|
||||||
'.tiff': 'image/tiff',
|
|
||||||
'.ts': 'video/mp2t',
|
|
||||||
'.ttf': 'font/ttf',
|
|
||||||
'.txt': 'text/plain',
|
|
||||||
'.vsd': 'application/vnd.visio',
|
|
||||||
'.wav': 'audio/wav',
|
|
||||||
'.weba': 'audio/webm',
|
|
||||||
'.webm': 'video/webm',
|
|
||||||
'.webp': 'image/webp',
|
|
||||||
'.woff': 'font/woff',
|
|
||||||
'.woff2': 'font/woff2',
|
|
||||||
'.xhtml': 'application/xhtml+xml',
|
|
||||||
'.xls': 'application/vnd.ms-excel',
|
|
||||||
'.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
||||||
'.xml': 'application/xml',
|
|
||||||
'.xul': 'application/vnd.mozilla.xul+xml',
|
|
||||||
'.zip': 'application/zip',
|
|
||||||
'.3gp': 'video/3gpp',
|
|
||||||
'.3g2': 'video/3gpp2',
|
|
||||||
'.7z': 'application/x-7z-compressed',
|
|
||||||
};
|
|
||||||
|
|
||||||
export default mimes;
|
export type Mimes = [string, string[]][]
|
||||||
|
|
||||||
|
export async function guess(extension: string): Promise<string> {
|
||||||
|
const mimes: Mimes = JSON.parse(await readFile('./mimes.json', 'utf8'));
|
||||||
|
|
||||||
|
const mime = mimes.find(x => x[0] === extension);
|
||||||
|
if (!mime) return 'application/octet-stream';
|
||||||
|
|
||||||
|
return mime[1][0];
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ import prisma from 'lib/prisma';
|
||||||
import { NextApiReq, NextApiRes, withZipline } from 'middleware/withZipline';
|
import { NextApiReq, NextApiRes, withZipline } from 'middleware/withZipline';
|
||||||
import { checkPassword } from 'lib/util';
|
import { checkPassword } from 'lib/util';
|
||||||
import datasource from 'lib/datasource';
|
import datasource from 'lib/datasource';
|
||||||
import mimes from 'lib/mimes';
|
import { guess } from 'lib/mimes';
|
||||||
import { extname } from 'path';
|
import { extname } from 'path';
|
||||||
|
|
||||||
async function handler(req: NextApiReq, res: NextApiRes) {
|
async function handler(req: NextApiReq, res: NextApiRes) {
|
||||||
|
@ -22,8 +22,12 @@ async function handler(req: NextApiReq, res: NextApiRes) {
|
||||||
|
|
||||||
const data = await datasource.get(image.file);
|
const data = await datasource.get(image.file);
|
||||||
if (!data) return res.error('Image not found');
|
if (!data) return res.error('Image not found');
|
||||||
const mimetype = mimes[extname(image.file)] ?? 'application/octet-stream';
|
|
||||||
|
const size = await datasource.size(image.file);
|
||||||
|
|
||||||
|
const mimetype = await guess(extname(image.file));
|
||||||
res.setHeader('Content-Type', mimetype);
|
res.setHeader('Content-Type', mimetype);
|
||||||
|
res.setHeader('Content-Length', size);
|
||||||
|
|
||||||
data.pipe(res);
|
data.pipe(res);
|
||||||
data.on('error', () => res.error('Image not found'));
|
data.on('error', () => res.error('Image not found'));
|
||||||
|
|
|
@ -4,10 +4,10 @@ import { NextServer, RequestHandler } from 'next/dist/server/next';
|
||||||
import { Image, PrismaClient } from '@prisma/client';
|
import { Image, PrismaClient } from '@prisma/client';
|
||||||
import { createServer, IncomingMessage, OutgoingMessage, ServerResponse } from 'http';
|
import { createServer, IncomingMessage, OutgoingMessage, ServerResponse } from 'http';
|
||||||
import { extname } from 'path';
|
import { extname } from 'path';
|
||||||
import { mkdir, readFile } from 'fs/promises';
|
import { mkdir } from 'fs/promises';
|
||||||
import { getStats, log, migrations } from './util';
|
import { getStats, log, migrations } from './util';
|
||||||
import Logger from '../lib/logger';
|
import Logger from '../lib/logger';
|
||||||
import mimes from '../lib/mimes';
|
import { guess } from '../lib/mimes';
|
||||||
import exts from '../lib/exts';
|
import exts from '../lib/exts';
|
||||||
import { version } from '../../package.json';
|
import { version } from '../../package.json';
|
||||||
import type { Config } from 'lib/config/Config';
|
import type { Config } from 'lib/config/Config';
|
||||||
|
@ -134,7 +134,7 @@ async function rawFile(
|
||||||
) {
|
) {
|
||||||
const data = await datasource.get(id);
|
const data = await datasource.get(id);
|
||||||
if (!data) return nextServer.render404(req, res as ServerResponse);
|
if (!data) return nextServer.render404(req, res as ServerResponse);
|
||||||
const mimetype = mimes[extname(id)] ?? 'application/octet-stream';
|
const mimetype = await guess(extname(id));
|
||||||
const size = await datasource.size(id);
|
const size = await datasource.size(id);
|
||||||
|
|
||||||
res.setHeader('Content-Type', mimetype);
|
res.setHeader('Content-Type', mimetype);
|
||||||
|
|
Loading…
Reference in a new issue