تخطَّ إلى المحتوى

Files#

يقدّم Vapor واجهة بسيطة لقراءة الملفات وكتابتها بشكل غير متزامن داخل معالجات المسار. هذه الواجهة مبنية على نوع NonBlockingFileIO الخاص بـ NIO.

القراءة#

الطريقة الرئيسية لقراءة ملف تُسلّم قطعًا (chunks) إلى معالج ردّ نداء (callback handler) أثناء قراءتها من القرص. يُحدَّد الملف المراد قراءته بمساره. ستبحث المسارات النسبية في دليل العمل الحالي للعملية.

// Asynchronously reads a file from disk.
let readComplete: EventLoopFuture<Void> = req.fileio.readFile(at: "/path/to/file") { chunk in
    print(chunk) // ByteBuffer
}

// Or

try await req.fileio.readFile(at: "/path/to/file") { chunk in
    print(chunk) // ByteBuffer
}
// Read is complete

إذا كنت تستخدم EventLoopFuture، فسيُشير الـ future المُرجَع عند اكتمال القراءة أو حدوث خطأ. إذا كنت تستخدم async/await، فبمجرد أن يعود await تكون القراءة قد اكتملت. وإذا حدث خطأ فسيُطلِق خطأً.

البثّ#

تُحوّل الطريقة streamFile ملفًا مبثوثًا إلى Response. ستضبط هذه الطريقة الترويسات المناسبة مثل ETag وContent-Type تلقائيًا.

// Asynchronously streams file as HTTP response.
req.fileio.streamFile(at: "/path/to/file").map { res in
    print(res) // Response
}

// Or

let res = req.fileio.streamFile(at: "/path/to/file")
print(res)

يمكن إرجاع النتيجة مباشرة بواسطة معالج المسار الخاص بك.

التجميع#

تقرأ الطريقة collectFile الملف المحدّد إلى مخزن مؤقت (buffer).

// Reads the file into a buffer.
req.fileio.collectFile(at: "/path/to/file").map { buffer in 
    print(buffer) // ByteBuffer
}

// or

let buffer = req.fileio.collectFile(at: "/path/to/file")
print(buffer)

تحذير

تتطلّب هذه الطريقة وجود الملف بأكمله في الذاكرة دفعة واحدة. استخدم القراءة المُقطّعة (chunked) أو المبثوثة للحدّ من استخدام الذاكرة.

الكتابة#

تدعم الطريقة writeFile كتابة مخزن مؤقت (buffer) إلى ملف.

// Writes buffer to file.
req.fileio.writeFile(ByteBuffer(string: "Hello, world"), at: "/path/to/file")

سيُشير الـ future المُرجَع عند اكتمال الكتابة أو حدوث خطأ.

Middleware#

لمزيد من المعلومات حول تقديم الملفات من مجلد Public في مشروعك تلقائيًا، راجع Middleware → FileMiddleware.

متقدّم#

للحالات التي لا تدعمها واجهة Vapor، يمكنك استخدام نوع NonBlockingFileIO الخاص بـ NIO مباشرة.

// Main thread.
let fileHandle = try await app.fileio.openFile(
    path: "/path/to/file", 
    eventLoop: app.eventLoopGroup.next()
).get()
print(fileHandle)

// In a route handler.
let fileHandle = try await req.application.fileio.openFile(
    path: "/path/to/file", 
    eventLoop: req.eventLoop)
print(fileHandle)

لمزيد من المعلومات، تفضّل بزيارة مرجع الواجهة الخاص بـ SwiftNIO.

تحرير هذه الصفحة