Thư viện phương tiện không gian nhận url đầy đủ

Gần đây, chúng tôi sử dụng gói Spatie laravel-multitenancy trong dự án CRM của khách hàng cùng với spatie/laravel-medialibrary

Hành vi mặc định của gói thư viện phương tiện là nó tạo một thư mục cho từng phương tiện có ID của nó trong đĩa được định cấu hình của chúng tôi, chẳng hạn như thư mục chung hoặc s3 hoặc bất kỳ đĩa nào chúng tôi đã định cấu hình

Điều này thực sự hiệu quả khi bạn đang xử lý một ứng dụng một bên thuê. Nhưng khi sử dụng nhiều đối tượng thuê, bạn có một bảng phương tiện trong mỗi cơ sở dữ liệu đối tượng thuê của mình. vì vậy mô hình này đơn giản là không hoạt động. Bởi vì sau đó bạn sẽ có nhiều tệp phương tiện trong cùng một thư mục từ những người thuê khác nhau

Vì vậy, những gì chúng tôi muốn làm là, thay vì có một cấu trúc như,

public -- media 
---- 1 
------ file.jpg 
---- 2 
------ file.jpg 
...

Những gì chúng tôi muốn đạt được là, chúng tôi muốn có một cấu trúc thư mục trong đó phương tiện của mọi đối tượng thuê sẽ nằm trong một thư mục riêng với id duy nhất của đối tượng thuê,

public -- media 
---- abcd1234 
// tenant1 Id 
------ 1 
-------- file.jpg 
------ 2 
-------- file.jpg 
---- efgh5678 
// tenant2 Id 
------ 1 
-------- file.jpg 
------ 2 
-------- file.jpg 
...

Thư viện Space Media rất dễ cấu hình, nơi bạn có thể viết trình tạo đường dẫn thư viện phương tiện của riêng mình. Đó là tài liệu rất tốt về ở đây

Vì vậy, những gì chúng tôi đã làm là, chúng tôi đã viết Trình tạo đường dẫn của riêng mình, có thể lưu trữ các tệp vào thư mục đối tượng thuê. Đây là cách nó trông giống như,

_______2_______

Những gì chúng tôi đã làm ở đây là, chúng tôi chỉ đơn giản là mở rộng Spatie\MediaLibrary\Support\PathGenerator\DefaultPathGenerator của Thư viện phương tiện và ghi đè chức năng getBasePath. Chúng tôi đã đính kèm tiền tố của người thuê nhà unique_id vào đường dẫn. vì vậy thay vì 1/file.png, nó sẽ trả về abcd1234/1/file.png

Tất cả những gì bạn cần đảm bảo là, bất cứ khi nào bạn tải phương tiện lên, ứng dụng của bạn phải được người thuê biết. Nếu không, nó sẽ không thể có được người thuê hiện tại

Hy vọng điều này sẽ hữu ích khi sử dụng thư viện phương tiện không gian cùng với nhiều người thuê không gian

Ngay cả khi bạn không sử dụng nhiều đối tượng thuê không gian, bạn vẫn có thể tạo PathGenerator của riêng mình và sử dụng nó theo cách riêng của bạn để có cấu trúc phương tiện bạn muốn

Điều này sẽ giúp tải xuống từ các nguồn ngăn bạn tải xuống hình ảnh của họ. Tùy thuộc vào nguồn mà bạn có thể cần chỉnh sửa tiêu đề nhiều hơn và tìm tiêu đề cho phép bạn tải xuống từ đó, tức là thêm tiêu đề bot của Google

Trong khi mã hóa trên một dự án nhỏ, tôi đã gặp sự cố sau. Tôi đang sử dụng gói laravel-medialibrary của Spatie để lưu trữ và liên kết tệp với các mô hình của tôi. Vì hình ảnh có thể chứa dữ liệu riêng tư và bí mật nên chúng không được truy cập từ bên ngoài. ví dụ nhỏ. Một người dùng đã đăng nhập vào ứng dụng của tôi và hình ảnh từ thư viện phương tiện được hiển thị. Khi anh ấy mở hình ảnh trong một tab mới, anh ấy sẽ thấy toàn bộ url. //example.com/customer-documents/1/page1.jpg. Khi anh ấy cố gắng sửa đổi url này và thay đổi url phương tiện thành 2 [customer-documents/2/page1.jpg], anh ấy sẽ thấy tài liệu tuyệt mật từ một người dùng khác

Và điều đó không tốt

Vì vậy, tôi đã tìm kiếm một giải pháp. Tôi nghĩ đó là trường hợp sử dụng hoàn hảo và là tùy chỉnh cho laravel-medialibrary

Vì vậy, tôi đã tạo một SignedMediaController mới sẽ xử lý tất cả các yêu cầu đang yêu cầu một phương tiện được liên kết

1public function __invoke[Request $request, Media $media, string $conversion = '']

3 if [!$request->hasValidSignature[]] {

7 // Your authentication logic here

11 return response[]->file[$media->getPath[$conversion], [

12 'Content-Type' => $media->mime_type,

Đầu tiên, nó kiểm tra xem url có chữ ký hợp lệ hay không và chặn yêu cầu nếu không. Vui lòng thêm logic xác thực tùy chỉnh của bạn tại đây, có thể nếu người dùng đã đăng nhập hoặc mối quan hệ $media->model[] thuộc về nhóm người dùng

Trước khi trả lại phương tiện, ob_get_clean xóa tất cả các tiêu đề và những thứ khác ngăn phương tiện hoạt động và tệp phương tiện với loại tệp gốc của nó sẽ được trả lại

Vì tôi làm việc với nhiều lượt chuyển đổi nên tôi đã thêm một tùy chọn để chỉ định một lượt chuyển đổi cho hình ảnh

Tôi đã đăng ký tuyến đường trong route/web của mình. tập tin php

1Route::get['/media/{media}/{conversion?}', SignedMediaController::class]->name['media'];

Như @devgummibeer đã nói, bạn cũng có thể sử dụng phần mềm trung gian

1Route::get['/media/{media}/{conversion?}', SignedMediaController::class]->name['media'];

0 cho tuyến đường, thay vì kiểm tra chữ ký hợp lệ trong bộ điều khiển

Vì tôi muốn tiếp tục sử dụng cú pháp

1Route::get['/media/{media}/{conversion?}', SignedMediaController::class]->name['media'];

1 nên tôi đã tạo trình tạo URL tùy chỉnh cho Thư viện phương tiện

Nó không chứa nhiều logic, vì vậy tôi đã mở rộng

1Route::get['/media/{media}/{conversion?}', SignedMediaController::class]->name['media'];

2 từ gói dấu cách và chỉ ghi đè phương thức cần thiết của mình

________số 8_______

Và đó là nó. Khi thực thi

1Route::get['/media/{media}/{conversion?}', SignedMediaController::class]->name['media'];

3, nó trả về một url đã ký, trỏ tới bộ điều khiển của tôi. Điều này kiểm tra xem chữ ký có hợp lệ không và trả về dữ liệu. Khi người dùng sửa đổi url, anh ta sẽ không thấy dữ liệu tuyệt mật từ những người dùng khác của tôi

Thư viện phương tiện không gian là gì?

Media Library Pro là gói tiện ích bổ sung tùy chọn cung cấp các thành phần Blade, Vue và React để tải tệp lên ứng dụng của bạn . Nó tích hợp đẹp mắt với thư viện phương tiện laravel. Bạn có thể mua giấy phép cho Media Library Pro trên trang sản phẩm tại spatie. thì là ở.

Làm cách nào để sử dụng thư viện Media trong laravel?

Laravel 9 Tải lên Ảnh đại diện bằng cách sử dụng Ví dụ về Thư viện Phương tiện Không gian .
Bước 1. Tải xuống ứng dụng Laravel
bước 2. Cập nhật chi tiết cơ sở dữ liệu
bước 3. Cài đặt Space Medialibrary trong Laravel
bước 4. Thiết lập di chuyển và mô hình
Bước 5. Tập tin BuildController
Bước 6. Xây dựng tuyến đường mới
Bước 7. Thiết lập tập tin Blade View
Bước 8. Thêm URL ứng dụng

Chủ Đề