Max file upload 500MB
This commit is contained in:
@@ -12,6 +12,25 @@ export const generateUploadUrl = mutation({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const MAX_ATTACHMENT_SIZE = 500 * 1024 * 1024; // 500MB
|
||||||
|
|
||||||
|
// Validate uploaded file size and return its URL. Deletes file if too large.
|
||||||
|
export const validateUpload = mutation({
|
||||||
|
args: { storageId: v.id("_storage") },
|
||||||
|
returns: v.string(),
|
||||||
|
handler: async (ctx, args) => {
|
||||||
|
const meta = await ctx.storage.getMetadata(args.storageId);
|
||||||
|
if (!meta) throw new Error("File not found in storage");
|
||||||
|
if (meta.size > MAX_ATTACHMENT_SIZE) {
|
||||||
|
await ctx.storage.delete(args.storageId);
|
||||||
|
throw new Error("File must be under 500MB");
|
||||||
|
}
|
||||||
|
const url = await getPublicStorageUrl(ctx, args.storageId);
|
||||||
|
if (!url) throw new Error("Failed to get file URL");
|
||||||
|
return url;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
// Get file URL from storage ID
|
// Get file URL from storage ID
|
||||||
export const getFileUrl = query({
|
export const getFileUrl = query({
|
||||||
args: { storageId: v.id("_storage") },
|
args: { storageId: v.id("_storage") },
|
||||||
|
|||||||
@@ -1072,7 +1072,8 @@ const ChatArea = ({ channelId, channelName, channelType, username, channelKey, u
|
|||||||
setInput(inputDivRef.current.textContent);
|
setInput(inputDivRef.current.textContent);
|
||||||
};
|
};
|
||||||
|
|
||||||
const processFile = (file) => { setPendingFiles(prev => [...prev, file]); };
|
const MAX_ATTACHMENT_SIZE = 500 * 1024 * 1024; // 500MB
|
||||||
|
const processFile = (file) => { if (file.size > MAX_ATTACHMENT_SIZE) { alert('File must be under 500MB'); return; } setPendingFiles(prev => [...prev, file]); };
|
||||||
const handleFileSelect = (e) => { if (e.target.files && e.target.files.length > 0) Array.from(e.target.files).forEach(processFile); };
|
const handleFileSelect = (e) => { if (e.target.files && e.target.files.length > 0) Array.from(e.target.files).forEach(processFile); };
|
||||||
const isExternalFileDrag = (e) => {
|
const isExternalFileDrag = (e) => {
|
||||||
const types = Array.from(e.dataTransfer.types);
|
const types = Array.from(e.dataTransfer.types);
|
||||||
@@ -1095,7 +1096,7 @@ const ChatArea = ({ channelId, channelName, channelType, username, channelKey, u
|
|||||||
const uploadRes = await fetch(uploadUrl, { method: 'POST', headers: { 'Content-Type': blob.type }, body: blob });
|
const uploadRes = await fetch(uploadUrl, { method: 'POST', headers: { 'Content-Type': blob.type }, body: blob });
|
||||||
const { storageId } = await uploadRes.json();
|
const { storageId } = await uploadRes.json();
|
||||||
|
|
||||||
const fileUrl = await convex.query(api.files.getFileUrl, { storageId });
|
const fileUrl = await convex.mutation(api.files.validateUpload, { storageId });
|
||||||
|
|
||||||
const metadata = {
|
const metadata = {
|
||||||
type: 'attachment',
|
type: 'attachment',
|
||||||
|
|||||||
Reference in New Issue
Block a user