پرش به محتوا
آرش حاتمی

hatamiarash7/ cf-worker-upload

سال توسعه: ۱۴۰۲ متن‌باز

تست آپلود فایل با Cloudflare Workers

ابزاری سبک برای آزمایش آپلود فایل روی Cloudflare Workers با رابط وب، ورودی multipart و Base64 و محاسبهٔ هش SHA-1 فایل دریافتی.

برای آزمایش آپلود، همیشه به یک سامانهٔ ذخیره‌سازی فایل نیاز ندارید؛ گاهی کافی است درخواست به مقصد برسد و بتوانید دادهٔ دریافتی را با فایل اصلی مقایسه کنید. پروژهٔ 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 نقطهٔ شروع کوچکی است؛ برای تبدیل آن به سرویس آپلود واقعی، ذخیره‌سازی، اعتبارسنجی و کنترل دسترسی باید جداگانه طراحی شوند.