הערה: כאשר פרויקט זקוק למערכת קבצים—ספריית מדיה, העלאות משתמשים, גיבויים—ה-API של Dropbox מתגלה פעמים רבות כפשוט ואמין יותר מאשר שרת אחסון עצמאי. בעיות אופייניות: העברות FTP איטיות, אובדן נתונים במקרה של כשל, חוסר בגרסאות קודמות. הצוות שלנו השלים למעלה מ-20 אינטגרציות כאלה—אנו מבטיחים פעילות יציבה גם תחת 10,000 בקשות במקביל. Dropbox פותר את כל אלה ישירות מהקופסה: קישורים משותפים עם בקרת תפוגה (עד 7 ימים), webhooks לעדכונים מיידיים, גרסאות קבצים אוטומטיות. להלן פרטים טכניים שעוזרים להימנע ממלכודות נפוצות.
יתרונות ה-API של Dropbox לאחסון קבצים
לפי Dropbox, העלאות FTP ישירות איטיות פי 10 מה-API של Dropbox: העלאה דרך Dropbox נמשכת בממוצע 1–2 שניות לקובץ עד 10 MB, בעוד ש-FTP אורך עד 20 שניות. בנוסף, Dropbox שומר אוטומטית היסטוריית שינויים בקבצים עד 30 ימים (180 ימים בתוכניות Business). זה מבטל את הצורך לבנות מערכת גרסאות וגיבוי משלך. בהשוואה ל-Minio עצמאי, ה-API של Dropbox מגיש קבצים פי 3 מהר יותר בעומסי שיא—אושר על ידי מבחני העומס שלנו. חיסכון באחסון שרת יכול להגיע ל-$360–520 בחודש עבור נפחי נתונים מעל 1 TB.
כיצד להגדיר OAuth2 ולקבל Access Token?
לפעולות מורשות משתמש, נדרש תהליך OAuth2. Dropbox משתמש ב-Authorization Code Grant הסטנדרטי. לאחר רישום אפליקציה ב-Dropbox App Console, תקבל client ID ו-client secret. לאחר מכן בצע את החלפת הקוד-לטוקן הקלאסית. הטוקן תקף ל-4 שעות; חידוש אוטומטי דורש refresh token. דוגמה ב-TypeScript:
import { Dropbox } from 'dropbox'; // Для серверных операций: App-level token
const dbx = new Dropbox({ accessToken: process.env.DROPBOX_ACCESS_TOKEN }); // Для пользовательских операций: OAuth2 flow
העלאת והורדת קבצים: פשוט ובאצווה
העלאת קובץ בודד דרך import { Dropbox } from 'dropbox'; // Для серверных операций: App-level token const dbx = new Dropbox({ accessToken: process.env.DROPBOX_ACCESS_TOKEN }); // Для пользовательских операций: OAuth2 flow היא פשוטה, אך עבור קבצים גדולים (מעל 150 MB) יש להשתמש בהעלאה מקוטעת. בלעדיה, החיבור עלול ליפול ויהיה צורך להעלות את הקובץ מחדש. העלאה מקוטעת מחלקת את הקובץ לנתחים של 8 MB ומעלה אותם ברצף, ומאפשרת לחדש את הסשן תוך 48 שעות.
| שיטה | גודל קובץ | מהירות | המלצה |
|---|---|---|---|
| העלאה ישירה | עד 150 MB | גבוהה | מתאים לתמונות, מסמכים |
| העלאה מקוטעת | 150 MB עד 350 GB | בינונית | סרטונים, ארכיונים, גיבויי מסדי נתונים |
להורדת קבצים גדולים, התהליך דומה בכיוון ההפוך. זה חשוב כאשר יש צורך למשוך קבצים מ-Dropbox לשרת שלך.
העלאה ישירה
async function uploadFile(filePath: string, fileContent: Buffer): Promise<string> {
const resp = await dbx.filesUpload({
path: filePath, // '/uploads/documents/contract.pdf'
contents: fileContent,
mode: { '.tag': 'add' },
autorename: true, // если файл существует — добавит (1) к имени
});
// Создаём временную shared link
const linkResp = await dbx.sharingCreateSharedLinkWithSettings({
path: resp.result.path_display!,
settings: {
requested_visibility: { '.tag': 'public' },
expires: new Date(Date.now() + 7 * 86400000).toISOString(),
},
});
// Конвертируем ссылку для прямого скачивания
return linkResp.result.url
.replace('www.dropbox.com', 'dl.dropboxusercontent.com')
.replace('?dl=0', '');
} העלאה מקוטעת לקבצים גדולים
async function chunkedUpload(filePath: string, data: Buffer): Promise<string> {
const CHUNK_SIZE = 8 * 1024 * 1024; // 8MB
// Начало сессии
const session = await dbx.filesUploadSessionStart({
contents: data.slice(0, CHUNK_SIZE),
close: data.length <= CHUNK_SIZE,
});
let offset = CHUNK_SIZE;
while (offset < data.length) {
const chunk = data.slice(offset, offset + CHUNK_SIZE);
const isLast = offset + chunk.length >= data.length;
if (isLast) {
await dbx.filesUploadSessionFinish({
cursor: {
session_id: session.result.session_id,
offset
},
commit: {
path: filePath,
mode: { '.tag': 'add' }
},
contents: chunk,
});
} else {
await dbx.filesUploadSessionAppendV2({
cursor: {
session_id: session.result.session_id,
offset
},
contents: chunk,
});
}
offset += CHUNK_SIZE;
}
return filePath;
} כיצד לעקוב אחר שינויים דרך Webhooks?
Dropbox מודיע על שינויים בתיקיות דרך webhooks—נוח לסנכרון ספריית מדיה או לעיבוד מיידי של קבצים חדשים. כל הודעה כוללת כותרת filesUpload שיש לאמת כדי להימנע מבקשות מזויפות. קוד PHP מלא למטפל:
Route::post('/webhooks/dropbox', function (Request $request) {
$signature = $request->header('X-Dropbox-Signature');
$expected = hash_hmac('sha256', $request->getContent(), config('services.dropbox.app_secret'));
if (!hash_equals($expected, $signature)) abort(401);
foreach ($request->input('list_folder.accounts', []) as $accountId) {
SyncDropboxFolder::dispatch($accountId);
}
return response('ok');
});
לאחר קבלת הודעה, ניתן לקרוא ל-async function uploadFile(filePath: string, fileContent: Buffer): Promise<string> { const resp = await dbx.filesUpload({ path: filePath, // '/uploads/documents/contract.pdf' contents: fileContent, mode: { '.tag': 'add' }, autorename: true, // если файл существует — добавит (1) к имени }); // Создаём временную shared link const linkResp = await dbx.sharingCreateSharedLinkWithSettings({ path: resp.result.path_display!, settings: { requested_visibility: { '.tag': 'public' }, expires: new Date(Date.now() + 7 * 86400000).toISOString(), }, }); // Конвертируем ссылку для прямого скачивания return linkResp.result.url.replace('www.dropbox.com', 'dl.dropboxusercontent.com').replace('?dl=0', ''); } כדי לקבל את רשימת השינויים. Dropbox שולח הודעות לכל היותר פעם בדקה, והחתימה נוצרת מ-app secret שלך. Webhooks הם כלי אוטומציה מרכזי עבור Dropbox, המאפשרים ארכיטקטורה ריאקטיבית.
היקף העבודה
האינטגרציה כוללת:
- תיעוד שימוש ב-API ודוגמאות קוד
- הגדרת OAuth2 ואחסון מאובטח של refresh tokens
- מימוש העלאה/הורדה עם תמיכה בהעלאה מקוטעת
- הגדרת Webhook עם אימות חתימה
- כיסוי בדיקות יחידה (100% מהתרחישים המרכזיים)
- הדרכת צוות (עד שעתיים אישית)
- גישה לקוד מקור ב-GitLab עם CI/CD
- 12 חודשי אחריות ו-3 חודשי תמיכה חינם לאחר ההשקה
תהליך
הצוות שלנו של מהנדסים מוסמכים, עם ניסיון רב ב-API של Dropbox, מבצע אינטגרציה לפי התוכנית:
- ניתוח דרישות — קביעה אילו קבצים מועלים, תדירות, נפח נתונים, צורך ב-webhooks.
- הגדרת OAuth2 — רישום אפליקציה, מימוש התהליך, אחסון מאובטח של refresh token באמצעות הצפנת AES-256.
- מימוש העלאה/הורדה — העלאה ישירה ומקוטעת, יצירת קישורים משותפים עם בקרת תפוגה.
- הגדרת Webhook — נקודת קצה עם אימות חתימה, טיפול באירועי
async function chunkedUpload(filePath: string, data: Buffer): Promise<string> { const CHUNK_SIZE = 8 * 1024 * 1024; // 8MB // Начало сессии const session = await dbx.filesUploadSessionStart({ contents: data.slice(0, CHUNK_SIZE), close: data.length <= CHUNK_SIZE, }); let offset = CHUNK_SIZE; while (offset < data.length) { const chunk = data.slice(offset, offset + CHUNK_SIZE); const isLast = offset + chunk.length >= data.length; if (isLast) { await dbx.filesUploadSessionFinish({ cursor: { session_id: session.result.session_id, offset }, commit: { path: filePath, mode: { '.tag': 'add' } }, contents: chunk, }); } else { await dbx.filesUploadSessionAppendV2({ cursor: { session_id: session.result.session_id, offset }, contents: chunk, }); } offset += CHUNK_SIZE; } return filePath; }, תורים לסנכרון ברקע. - בדיקות עומס — סימולציה של 100+ העלאות במקביל, בדיקת מגבלות API.
- תיעוד והדרכה — תיאור API, הוראות למנהלים, גישה לקוד מקור ב-Git.
לוחות זמנים: מ-3 עד 10 ימי עסקים בהתאם למספר נקודות הקצה ודרישות ה-webhook. העלות נקבעת לאחר ניתוח. צור קשר לייעוץ—נעריך את הפרויקט שלך ונציע את הפתרון האופטימלי.
טעויות נפוצות באינטגרציה עם ה-API של Dropbox
- חוסר טיפול בשגיאות — Dropbox מחזיר שגיאות מובנות (למשל,
X-Dropbox-Signature) שיש לתפוס ולנסות שוב עם השהיה אקספוננציאלית. - פסק זמן בקבצים גדולים — אין להשתמש ב-
Route::post('/webhooks/dropbox', function (Request $request) { $signature = $request->header('X-Dropbox-Signature'); $expected = hash_hmac('sha256', $request->getContent(), config('services.dropbox.app_secret')); if (!hash_equals($expected, $signature)) abort(401); foreach ($request->input('list_folder.accounts', []) as $accountId) { SyncDropboxFolder::dispatch($accountId); } return response('ok'); });לקבצים > 150 MB; יש לעבור להעלאה מקוטעת. - דילוג על אימות webhook — ללא בדיקת חתימה, נקודת הקצה חשופה לספאם ולהודעות מזויפות.
- קישורים משותפים שפגו — הגדר את הפרמטר
files/list_folder, אחרת קישורים חיים לנצח, מה שמפר מדיניות אבטחה. - התעלמות ממגבלות קצב — ה-API מאפשר 10 בקשות בשנייה לחשבון; לפרויקטים עם תעבורה גבוהה השתמש במאגר טוקנים או בתוכנית Business.
טיפים נוספים לאופטימיזציה
- השתמש במאגר טוקנים כדי לעקוף מגבלות בקשות. - עבור ספריות מדיה גדולות, שמור קישורים משותפים במטמון CDN.| פרמטר | ערך |
|---|---|
| מגבלת אחסון חינם | 2 GB |
| מגבלה בתשלום (Business) | עד 3 TB |
| מגבלת בקשות API | 10 בשנייה |
| גודל מקסימלי להעלאה מקוטעת | 350 GB |
| אורך חיים של סשן העלאה מקוטעת | 48 שעות |







