changed all things to use id instead of file name
This commit is contained in:
		
							parent
							
								
									b4eb2b4657
								
							
						
					
					
						commit
						7133c544e1
					
				| @ -37,13 +37,13 @@ export default function FileGrid({ session }: FileGridProps) { | ||||
|     } | ||||
|   }; | ||||
| 
 | ||||
|   const handleDownload = async (fileName: string) => { | ||||
|   const handleDownload = async (fileId: string, fileName: string) => { | ||||
|     try { | ||||
|       const response = await fetch(`/api/files/download?fileId=${encodeURIComponent(fileName)}`); | ||||
|       const response = await fetch(`/api/files/download?fileId=${encodeURIComponent(fileId)}&fileName=${encodeURIComponent(fileName)}`); | ||||
|       if (!response.ok) { | ||||
|         throw new Error("Failed to download file"); | ||||
|       } | ||||
| 
 | ||||
|       // Download the file with the correct filename
 | ||||
|       const blob = await response.blob(); | ||||
|       const url = window.URL.createObjectURL(blob); | ||||
|       const a = document.createElement("a"); | ||||
| @ -143,7 +143,7 @@ export default function FileGrid({ session }: FileGridProps) { | ||||
|             <div className="flex gap-2"> | ||||
|               {/* Download Button */} | ||||
|               <button | ||||
|                 onClick={() => handleDownload(file.name)} | ||||
|                 onClick={() => handleDownload(file.id,file.name)} | ||||
|                 className="flex items-center justify-center rounded-full bg-blue-500 p-2 hover:bg-blue-600" | ||||
|               > | ||||
|                 <svg | ||||
|  | ||||
| @ -5,10 +5,14 @@ import { promises as fs } from "fs"; | ||||
| export async function GET(req: Request) { | ||||
|   const url = new URL(req.url); | ||||
|   const fileId = url.searchParams.get("fileId"); | ||||
|   const fileName = url.searchParams.get("fileName"); | ||||
| 
 | ||||
|   if (!fileId) { | ||||
|     return NextResponse.json({ error: "File id is required" }, { status: 400 }); | ||||
|   } | ||||
|   if (!fileName){ | ||||
|     return NextResponse.json({ error: "File name is required" }, { status: 400 }); | ||||
|   } | ||||
| 
 | ||||
|   try { | ||||
|     const filePath = path.join(process.cwd(), "uploads", fileId); | ||||
| @ -17,7 +21,7 @@ export async function GET(req: Request) { | ||||
|     return new Response(fileBuffer, { | ||||
|       headers: { | ||||
|         "Content-Type": "application/octet-stream", | ||||
|         "Content-Disposition": `attachment; filename="${fileId}"`, | ||||
|         "Content-Disposition": `attachment; filename="${fileName}"`, | ||||
|       }, | ||||
|     }); | ||||
|   } catch (error) { | ||||
|  | ||||
| @ -26,7 +26,7 @@ export async function DELETE(req: Request) { | ||||
|       return NextResponse.json({ error: "Resource not found or unauthorized" }, { status: 404 }); | ||||
|     } | ||||
| 
 | ||||
|     const filePath = path.join(process.cwd(), "uploads", path.basename(resource.name)); | ||||
|     const filePath = path.join(process.cwd(), "uploads", path.basename(body.id)); | ||||
|     await fs.unlink(filePath).catch((err) => { | ||||
|       console.error("Error deleting file from filesystem:", err); | ||||
|     }); | ||||
|  | ||||
| @ -5,15 +5,15 @@ import { auth } from "~/server/auth"; | ||||
| export async function GET(req: Request) { | ||||
|   const session = await auth(); | ||||
|   const url = new URL(req.url); | ||||
|   const fileName = url.searchParams.get("id"); | ||||
|   const fileId = url.searchParams.get("id"); | ||||
| 
 | ||||
|   if (!fileName) { | ||||
|   if (!fileId) { | ||||
|     return NextResponse.json({ error: "File name is required" }, { status: 400 }); | ||||
|   } | ||||
| 
 | ||||
|   try { | ||||
|     const file = await db.file.findFirst({ | ||||
|       where: { name: fileName }, | ||||
|       where: { id: fileId }, | ||||
|       include: { uploadedBy: true }, | ||||
|     }); | ||||
| 
 | ||||
|  | ||||
| @ -6,6 +6,7 @@ import { auth } from "~/server/auth"; | ||||
| import Busboy from "busboy"; | ||||
| import { Readable } from "stream"; | ||||
| import { notifyClients } from "~/utils/notifyClients"; | ||||
| import crypto from "crypto"; | ||||
| 
 | ||||
| export const config = { | ||||
|   api: { | ||||
| @ -15,6 +16,8 @@ export const config = { | ||||
| 
 | ||||
| export async function POST(req: Request) { | ||||
|   const session = await auth(); | ||||
|   // generate id for the file
 | ||||
|   const guid = crypto.randomUUID(); | ||||
| 
 | ||||
|   if (!session?.user) { | ||||
|     return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); | ||||
| @ -59,13 +62,14 @@ export async function POST(req: Request) { | ||||
|     busboy.on("finish", () => { | ||||
|       void (async () => { | ||||
|         try { | ||||
|           const filePath = path.join(uploadDir, fileName); | ||||
|           const filePath = path.join(uploadDir, guid); | ||||
|           await fs.writeFile(filePath, fileBuffer); | ||||
| 
 | ||||
|           // Save file metadata to the database
 | ||||
|           const newFile = await db.file.create({ | ||||
|             data: { | ||||
|               url: `/share?id=${fileName}`, | ||||
|               id: guid, | ||||
|               url: `/share?id=${guid}`, | ||||
|               name: fileName, | ||||
|               size: fileBuffer.length, | ||||
|               extension: path.extname(fileName), | ||||
|  | ||||
| @ -55,31 +55,31 @@ function UploadsPage() { | ||||
|         toast.error("File details not available."); | ||||
|         return; | ||||
|       } | ||||
|       const response = await fetch(`/api/files/download?fileId=${encodeURIComponent(fileDetails?.name)}`); // Use optional chaining
 | ||||
|       if (!response.ok) { | ||||
|         throw new Error("Failed to download file"); | ||||
|       } | ||||
| 
 | ||||
|       const blob = await response.blob(); | ||||
|       const url = window.URL.createObjectURL(blob); | ||||
|       const a = document.createElement("a"); | ||||
|       a.href = url; | ||||
|       a.download = fileId ?? "downloaded-file"; // Use nullish coalescing
 | ||||
|       document.body.appendChild(a); | ||||
|       a.click(); | ||||
|       a.remove(); | ||||
|       window.URL.revokeObjectURL(url); | ||||
| 
 | ||||
|       toast.success("File downloaded successfully!"); | ||||
|     } catch (err) { | ||||
|       console.error(err); | ||||
|       toast.error("Failed to download file."); | ||||
|     } | ||||
|   }; | ||||
|           const response = await fetch(`/api/files/download?fileId=${encodeURIComponent(fileDetails.id)}&fileName=${encodeURIComponent(fileDetails.name)}`); | ||||
|           if (!response.ok) { | ||||
|             throw new Error("Failed to download file"); | ||||
|           } | ||||
|           // Download the file with the correct filename
 | ||||
|           const blob = await response.blob(); | ||||
|           const url = window.URL.createObjectURL(blob); | ||||
|           const a = document.createElement("a"); | ||||
|           a.href = url; | ||||
|           a.download = fileDetails.name; | ||||
|           document.body.appendChild(a); | ||||
|           a.click(); | ||||
|           a.remove(); | ||||
|           window.URL.revokeObjectURL(url); | ||||
|      | ||||
|           toast.success(`File "${fileDetails.name}" downloaded successfully!`); | ||||
|         } catch (err) { | ||||
|           console.error(err); | ||||
|           toast.error("Failed to download file."); | ||||
|         } | ||||
|       }; | ||||
| 
 | ||||
|   const handleShare = () => { | ||||
|     if (fileDetails) { | ||||
|       const shareableLink = `${window.location.origin}/share?id=${fileDetails.name}`; | ||||
|       const shareableLink = `${window.location.origin}/share?id=${fileDetails.id}`; | ||||
|       navigator.clipboard | ||||
|         .writeText(shareableLink) | ||||
|         .then(() => toast.success("Shareable link copied to clipboard!")) | ||||
| @ -136,6 +136,13 @@ function UploadsPage() { | ||||
| 
 | ||||
|   return ( | ||||
|     <main className="relative flex min-h-screen flex-col items-center justify-center bg-gradient-to-b from-[#2e026d] to-[#15162c] text-white"> | ||||
|         <meta property="og:title" content={fileDetails.name} /> | ||||
|         <meta property="og:description" content={`File details for ${fileDetails.name}`} /> | ||||
|         <meta property="og:image" content={fileDetails.url} /> | ||||
|         <meta property="og:url" content={`${window.location.origin}/share?id=${fileDetails.id}`} /> | ||||
|         <meta property="og:type" content="website" /> | ||||
|         <meta property="og:site_name" content="File Hosting - Suchodupin" /> | ||||
|         <meta property="og:locale" content="en_US" /> | ||||
|       <Toaster position="top-right" reverseOrder={false} /> | ||||
|       <div className="absolute top-4 left-4"> | ||||
|         <button | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user