Akses file tersimpan
Daftar, URL unduh ter-sign, URL publik, dan hapus lewat /api/storage.
Setelah unggah, objek tetap di bucket privat. Akses dikontrol di API: hanya pemilik yang bisa mendaftar, menandatangani, atau menghapus file READY miliknya.
Daftar file
GET /api/storage/Memerlukan auth. Mengembalikan file pengguna saat ini berstatus READY.
URL unduh ter-sign
GET /api/storage/signed?path=users/{userId}/….pdfMemakai getSignedUrl dari @repo/storage (kedaluwarsa default 15 menit). Siapa pun yang punya URL bisa mengambil objek sampai kedaluwarsa — jaga TTL pendek dan hanya kembalikan URL ke pemanggil yang berwenang.
const res = await fetch(
`/api/storage/signed?path=${encodeURIComponent(filePath)}`,
{ credentials: "include" },
);
const { url } = await res.json();
window.open(url, "_blank");Anda juga bisa memanggil getSignedUrl dari kode server di @repo/storage saat membangun handler sendiri:
import { getSignedUrl } from "@repo/storage";
const { url } = await getSignedUrl({
path: filePath,
expiresIn: 60, // detik
});URL publik
GET /api/storage/public?path=…Memerlukan S3_PUBLIC_URL. Mengembalikan URL publik stabil (getPublicUrl) alih-alih tanda tangan berbatas waktu. Pakai hanya jika objek sengaja publik lewat r2.dev atau domain CDN kustom.
Lebih baik URL ter-sign
Untuk file pengguna privat, pakai /api/storage/signed. Biarkan
S3_PUBLIC_URL kosong kecuali Anda butuh aset publik.
Hapus
DELETE /api/storage/:idMenghapus objek di bucket (deleteObject) dan menandai baris Prisma DELETED. Hanya pemilik yang bisa menghapus.
Proxy redirect opsional
Jika Anda ingin path menghadap browser seperti /files/... alih-alih menyerahkan URL ter-sign ke client, Anda bisa menambah route Next.js yang memeriksa auth, memanggil getSignedUrl, lalu redirect. Pola itu tidak di-ship di repo ini — jaga pengecekan kepemilikan di handler dan pertimbangkan Cache-Control jika konten aman di-cache sebentar.
Terkait
- Unggah file
- Setup
- API — konvensi modul Hono