برای آزمایش آپلود، همیشه به یک سامانهٔ ذخیرهسازی فایل نیاز ندارید؛ گاهی کافی است درخواست به مقصد برسد و بتوانید دادهٔ دریافتی را با فایل اصلی مقایسه کنید. پروژهٔ cf-worker-upload همین کار را با یک Worker انجام میدهد: فایل را دریافت میکند، هش SHA-1 آن را محاسبه میکند و نتیجه را برمیگرداند.
این پروژه یک ابزار تست است، نه سرویس میزبانی فایل. در پیادهسازی فعلی اتصال به فضای ذخیرهسازی یا پایگاه داده وجود ندارد و لینک دانلودی هم تولید نمیشود.
چه راههایی برای آپلود دارد؟
Worker با JavaScript نوشته شده و سه روش استفاده دارد:
- مرورگر: با باز کردن مسیر
/یک فرم انتخاب فایل نمایش داده میشود. انتخاب فایل، آپلود را آغاز میکند و رابط وب درصد پیشرفت و تعداد بایتهای ارسالشده را نشان میدهد. پس از دریافت پاسخ، نام، اندازه و هش فایل نمایش داده میشود. - درخواست multipart: با ارسال
POST /و قرار دادن فایل در فیلدfile، پاسخ شامل فیلدهایname،type،sizeوhashخواهد بود. مقدارtypeاز اطلاعات فایل ارسالی گرفته میشود و به معنی تشخیص مستقل نوع محتوای فایل نیست. - ورودی Base64: مسیر
POST /b64یک بدنهٔ JSON با کلیدfileمیگیرد، مقدار آن را از Base64 به بایت تبدیل میکند و فقط فیلدhashرا برمیگرداند.
منطق این مسیرها و محاسبهٔ هش با crypto.subtle.digest در فایل Worker قرار دارد. ظاهر فرم نیز از Bootstrap استفاده میکند که CSS آن از یک CDN بیرونی بارگذاری میشود.
نصب و تنظیمات
برای اجرای ابزار توسعه به Node.js و npm نیاز دارید؛ نسخهٔ Node.js را مطابق نیازمندیهای Wrangler انتخاب کنید. برای استقرار نیز باید حساب Cloudflare داشته باشید. خود Worker روی محیط Cloudflare اجرا میشود، نه یک سرور Node.js شخصی.
ابتدا مخزن و وابستگیهای آن را دریافت کنید:
git clone https://github.com/hatamiarash7/cf-worker-upload.git
cd cf-worker-upload
npm ci
cp wrangler.toml.example wrangler.toml
نکتهٔ سازگاری: وابستگی فعلی پروژه Wrangler 4 است، اما فایل نمونه هنوز گزینهٔ قدیمی node_compat = true را دارد. این گزینه در نسخهٔ ۴ حذف شده است. پیش از اجرا، آن خط را از فایل محلی wrangler.toml حذف کنید؛ کد فعلی Worker از APIهای اختصاصی Node.js استفاده نمیکند و برای این پیادهسازی نیازی به فعال کردن سازگاری Node.js نیست. جزئیات این تغییر در راهنمای مهاجرت Wrangler آمده است.
فایل تنظیمات پس از حذف آن گزینه به این شکل خواهد بود:
compatibility_date = "2023-08-01"
main = "src/worker.js"
name = "cf-worker-upload"
مقدار main نقطهٔ ورود کد و name نام Worker است. تاریخ سازگاری بالا از نمونهٔ مخزن گرفته شده و تاریخ ساخت یا انتشار مقاله نیست.
اجرای محلی و استقرار
اسکریپت start در پروژه، دستور wrangler dev را اجرا میکند:
npm start
برای آزمایش محلی، آدرسی را که Wrangler در ترمینال نمایش میدهد در مرورگر باز کنید. برای انتشار روی حساب Cloudflare نیز از این دستورها استفاده کنید:
npx wrangler login
npm run deploy
اسکریپت deploy همان wrangler deploy است. پس از استقرار، آدرس اعلامشده برای Worker را باز کنید و یک فایل آزمایشی انتخاب کنید. دستورهای پایهٔ انتشار و استفاده در README مخزن هم آمدهاند.
آزمایش با خط فرمان
ارسال فایل با multipart
در نمونهٔ زیر، WORKER_URL یک آدرس نمونه است؛ آن را با آدرس واقعی Worker محلی یا منتشرشدهٔ خود جایگزین کنید. دستور truncate یک فایل آزمایشی ۵ مگابایتی میسازد و curl آن را در فیلد file ارسال میکند:
WORKER_URL='https://your-worker.example.workers.dev'
truncate -s 5M file.img
curl -F 'file=@file.img' "$WORKER_URL/"
پاسخ این مسیر یک رشتهٔ JSON شامل مشخصات فایل و هش آن است. برای مقایسه، هش همان فایل را روی سیستم خود نیز محاسبه کنید؛ برای مثال در لینوکس:
sha1sum file.img
مقدار خروجی این دستور را با فیلد hash در پاسخ Worker مقایسه کنید. یکسان بودن آنها برای این آزمایش به بررسی یکسان بودن دادهٔ ارسالی و دریافتی کمک میکند.
ارسال داده با Base64
برای آزمایش مسیر دوم، میتوانید رشتهٔ Base64 مربوط به متن hello را ارسال کنید:
curl "$WORKER_URL/b64" \
-H 'Content-Type: application/json' \
--data '{"file":"aGVsbG8="}'
در این روش پاسخ فقط کلید hash دارد. مقدار file باید خود رشتهٔ Base64 باشد؛ پیشوندهایی مانند data:text/plain;base64, بخشی از ورودی مورد انتظار این مسیر نیستند.
محدودیتها و نکات استفاده
- پردازش در حافظه: فایل multipart با
arrayBuffer()خوانده میشود و ورودی Base64 هم کامل به حافظه میآید. این پیادهسازی آپلود جریانی نیست؛ برای فایلهای بزرگ باید محدودیتهای بدنهٔ درخواست و حافظهٔ Workers را در نظر بگیرید. - اعتبارسنجی محدود: مسیر multipart فرض میکند فیلد
fileواقعاً یک فایل است. برای JSON نامعتبر، Base64 نامعتبر یا نبود این فیلدها، مدیریت خطای کامل پیادهسازی نشده است. در مسیر/b64فقط خالی بودن کامل بدنه صریحاً با وضعیت400پاسخ داده میشود. - بدون کنترل دسترسی داخلی: کد فعلی احراز هویت یا محدودسازی نرخ درخواست ندارد. پیش از در دسترس قرار دادن عمومی، دسترسی و مصرف منابع را متناسب با نیازتان کنترل کنید و برای تست از دادهٔ غیرحساس استفاده کنید.
- هش، نه تضمین امنیت: SHA-1 در این ابزار برای مقایسهٔ داده به کار رفته است؛ از آن برای اثبات اصالت فایل یا طراحی سازوکار امنیتی استفاده نکنید.
- پیشرفت ارسال با پایان پردازش فرق دارد: نوار پیشرفت مرورگر وضعیت ارسال درخواست را نشان میدهد. نتیجهٔ محاسبهٔ هش پس از رسیدن پاسخ Worker نمایش داده میشود.
کد پروژه با مجوز MIT منتشر شده است. اگر به یک مقصد ساده برای آزمایش درخواستهای آپلود و بررسی هش فایل دریافتی نیاز دارید، این Worker نقطهٔ شروع کوچکی است؛ برای تبدیل آن به سرویس آپلود واقعی، ذخیرهسازی، اعتبارسنجی و کنترل دسترسی باید جداگانه طراحی شوند.