تخطي إلى المحتوى الرئيسي

معالجة الملفات

يوفر Dropup تجربة سلسة للتعامل مع الملفات من لحظة اختيارها حتى رفعها.

طرق اختيار الملفات

السحب والإفلات

استخدم getDropProps() لتمكين السحب والإفلات على أي عنصر:

function DropZone() {
const { getDropProps, getInputProps, state } = useDropup();

return (
<div
{...getDropProps()}
style={{
border: state.isDragging ? '2px dashed blue' : '2px dashed gray',
backgroundColor: state.isDragging ? '#f0f8ff' : 'transparent',
}}
>
<input {...getInputProps()} />
<p>أفلت الملفات هنا</p>
</div>
);
}

النقر للاختيار

منطقة الإفلات قابلة للنقر بشكل افتراضي:

<div {...getDropProps()}>
<input {...getInputProps()} />
<p>انقر أو اسحب الملفات هنا</p>
</div>

الاختيار البرمجي

افتح حوار الملفات برمجياً:

const { openFileDialog } = useDropup();

<button onClick={openFileDialog}>
اختر الملفات
</button>

إضافة الملفات برمجياً

أضف الملفات مباشرة (مفيد لأحداث اللصق أو التكاملات):

const { actions } = useDropup();

// من الحافظة
document.addEventListener('paste', (e) => {
const files = e.clipboardData?.files;
if (files?.length) {
actions.addFiles(files);
}
});

بنية كائن الملف

كل ملف في مصفوفة files له هذه البنية:

interface DropupFile {
// التعريف
id: string; // معرف فريد (مولد تلقائياً)
file: File; // كائن File الأصلي من المتصفح

// البيانات الوصفية
name: string; // اسم الملف
size: number; // الحجم بالبايتات
type: string; // نوع MIME (مثل "image/png")

// المعاينة (للصور)
preview?: string; // رابط Object URL للمعاينة

// حالة الرفع
status: FileStatus; // 'idle' | 'uploading' | 'complete' | 'error' | 'paused'
progress: number; // 0-100

// النتائج
uploadedUrl?: string; // الرابط بعد نجاح الرفع
response?: unknown; // استجابة الخادم
error?: DropupError; // تفاصيل الخطأ في حالة الفشل

// بيانات مخصصة
meta?: Record<string, unknown>;
}

دورة حياة حالة الملف

idle → uploading → complete
↘ error → (retry) → uploading
↘ paused → (resume) → uploading

قيم الحالة

الحالةالوصف
idleالملف مضاف لكن لم يبدأ الرفع بعد
uploadingقيد الرفع حالياً
completeالرفع ناجح
errorفشل الرفع
pausedالرفع متوقف مؤقتاً (للرفع القابل للاستئناف)

العمل مع الملفات

الوصول للملفات

const { files } = useDropup();

// جميع الملفات
console.log(files);

// التصفية حسب الحالة
const uploading = files.filter(f => f.status === 'uploading');
const completed = files.filter(f => f.status === 'complete');
const failed = files.filter(f => f.status === 'error');

إزالة الملفات

const { files, actions } = useDropup();

// إزالة ملف واحد
actions.remove(files[0].id);

// إزالة جميع الملفات
actions.reset();

تحديث البيانات الوصفية للملف

const { actions } = useDropup();

// إضافة بيانات وصفية مخصصة
actions.updateFileMeta(fileId, {
customField: 'value',
category: 'documents',
});

معاينات الملفات

لملفات الصور، يمكن لـ Dropup إنشاء روابط معاينة:

const { files } = useDropup({
generatePreviews: true, // الافتراضي: true
});

// استخدام المعاينة في واجهتك
{files.map(file => (
file.preview && (
<img
src={file.preview}
alt={file.name}
style={{ maxWidth: 100, maxHeight: 100 }}
/>
)
))}
إدارة الذاكرة

روابط المعاينة هي Object URLs التي تستهلك الذاكرة. يقوم Dropup تلقائياً بإلغائها عند إزالة الملفات أو إلغاء تحميل المكون.

تنسيق حجم الملف

مساعد لعرض أحجام الملفات:

function formatFileSize(bytes: number): string {
if (bytes === 0) return '0 بايت';
const k = 1024;
const sizes = ['بايت', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

// الاستخدام
{files.map(file => (
<span>{formatFileSize(file.size)}</span>
))}

التعامل مع الملفات الكبيرة

للملفات الكبيرة، ضع في اعتبارك الرفع المجزأ:

import { useDropup, createChunkedUploader } from '@samithahansaka/dropup';

const { files } = useDropup({
upload: createChunkedUploader({
url: '/api/upload',
chunkSize: 5 * 1024 * 1024, // أجزاء 5MB
}),
});

راجع الرفع المجزأ لمزيد من التفاصيل.