1. Giới thiệu
- XIn chào mọi người hôm này mình có 1 bài viết về mã hóa tệp lớn khi upload dữ liệu lên hệ thống . Hôm nay mình muốn chỉ cho bạn cách tải lên và mã hóa các tệp lớn lên hệ thống , sử dụng package Laravel và FileVault .
- Đầu tiên, mình sẽ giải thích một vài khái niệm và phương pháp mà chúng ta sẽ sử dụng .
2. Streaming Files to Amazon S3
Laravel đã cung cấp tất cả các công cụ cần thiết để tải tệp lên Amazon S3. Nếu bạn không biết cách thực hiện điều đó, hãy xem các hàm putFile và putFileAs functions on the Storage facad . Với bất kỳ chức năng nào trong hai chức năng này, Laravel sẽ tự động quản lý việc truyền tệp đến một vị trí lưu trữ, chẳng hạn như Amazon S3. Tất cả bạn cần làm nó sẽ kiểu như này =)) :
1 2 | Storage::disk('s3')->putFile('photos', new File('/path/to/photo')); |
Truyền tệp đến S3 có thể mất nhiều thời gian, tùy thuộc vào tốc độ mạng. Ngay cả khi các hàm putFile và putFileAs truyền phát tệp theo phân đoạn thì tiêu tốn rất nhiều bộ nhớ . Quá trình có thể mất rất nhiều thời gian để hoàn thành, gây ra thời gian chờ. Đó là lý do tại sao nó khuyến khích chúng ta sử dụng queued jobs.
3. Using Queued Jobs
- Hàng đợi cho phép bạn trì hoãn việc xử lý một tác vụ tốn thời gian. Trì hoãn các tác vụ tốn thời gian này sẽ tăng tốc đáng kể các yêu cầu web đến ứng dụng của bạn .
- Chúng ta sẽ sử dụng hai công việc được ném vào queue riêng biệt, một cái để mã hóa tệp và một cái để tải tệp được mã hóa lên Amazon S3.
- Trong Laravel, bạn có thể xâu chuỗi các queue để các công việc sẽ chạy theo trình tự. Bằng cách này, chúng ta có thể bắt đầu tải tệp lên S3 ngay sau khi tệp được mã hóa.
4. Configure Amazon S3
- Trước tiên, bạn sẽ cần cấu hình S3 ở phía Amazon và tạo một nhóm nơi chúng ta sẽ lưu trữ các tệp được mã hóa. link config bạn có thể thảm khảo ở đây và ném vào file .env nhé .
- Theo document của Laravel, chúng ta cũng cần cài đặt Flysystem adapter package thông qua composer :
1 2 | composer require league/flysystem-aws-s3-v3 |
- Tiếp theo mình add 1 package cached adapter
1 2 | composer require league/flysystem-cached-adapter |
5. Creating Queueable Jobs
- đầu tiên sẽ make 2 file queue như đã nói ở trên là mỗi 1 queue sẽ phục vụ cho 1 việc riêng biệt
1 2 3 | php artisan make:job EncryptFile php artisan make:job MoveFileToS3 |
- sẽ có 2 file queue đc tạo ra ở đây app/Http/Jobs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Jobs</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Bus<span class="token punctuation"></span>Queueable</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Contracts<span class="token punctuation"></span>Queue<span class="token punctuation"></span>ShouldQueue</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Foundation<span class="token punctuation"></span>Bus<span class="token punctuation"></span>Dispatchable</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Queue<span class="token punctuation"></span>InteractsWithQueue</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Queue<span class="token punctuation"></span>SerializesModels</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">SoareCostin<span class="token punctuation"></span>FileVault<span class="token punctuation"></span>Facades<span class="token punctuation"></span>FileVault</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">EncryptFile</span> <span class="token keyword">implements</span> <span class="token class-name">ShouldQueue</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">Dispatchable</span><span class="token punctuation">,</span> InteractsWithQueue<span class="token punctuation">,</span> Queueable<span class="token punctuation">,</span> SerializesModels<span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$filename</span><span class="token punctuation">;</span> <span class="token comment">/** * Create a new job instance. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">filename</span> <span class="token operator">=</span> <span class="token variable">$filename</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Execute the job. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> FileVault<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">encrypt</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">filename</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Jobs</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Exception</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Bus<span class="token punctuation"></span>Queueable</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Contracts<span class="token punctuation"></span>Queue<span class="token punctuation"></span>ShouldQueue</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Foundation<span class="token punctuation"></span>Bus<span class="token punctuation"></span>Dispatchable</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Http<span class="token punctuation"></span>File</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Queue<span class="token punctuation"></span>InteractsWithQueue</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Queue<span class="token punctuation"></span>SerializesModels</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Support<span class="token punctuation"></span>Facades<span class="token punctuation"></span>Storage</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">MoveFileToS3</span> <span class="token keyword">implements</span> <span class="token class-name">ShouldQueue</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">Dispatchable</span><span class="token punctuation">,</span> InteractsWithQueue<span class="token punctuation">,</span> Queueable<span class="token punctuation">,</span> SerializesModels<span class="token punctuation">;</span> <span class="token keyword">protected</span> <span class="token variable">$filename</span><span class="token punctuation">;</span> <span class="token comment">/** * Create a new job instance. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">filename</span> <span class="token operator">=</span> <span class="token variable">$filename</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'.enc'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Execute the job. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">handle</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Upload file to S3</span> <span class="token variable">$result</span> <span class="token operator">=</span> Storage<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">disk</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'s3'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">putFileAs</span><span class="token punctuation">(</span> <span class="token single-quoted-string string">'/'</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token function">storage_path</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'app/'</span> <span class="token punctuation">.</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">filename</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">filename</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Forces collection of any existing garbage cycles</span> <span class="token comment">// If we don't add this, in some cases the file remains locked</span> <span class="token function">gc_collect_cycles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$result</span> <span class="token operator">==</span> <span class="token boolean">false</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Couldn't upload file to S3"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// delete file from local filesystem</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Storage<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">disk</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'local'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">filename</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span>'File could not be deleted from the local filesystem '<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
Như bạn có thể thấy, việc EncryptFile rất đơn giản – chúng ta chỉ sử dụng gói FileVault để mã hóa tệp và lưu nó vào cùng thư mục có cùng tên .
Thay vì mã hóa bằng FileVault bằng phương thức store, chúng ta dispatch nó vào hàng đợi như sau :
1 2 3 4 | EncryptFile<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">withChain</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">MoveFileToS3</span><span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Tiếp theo, trong method index , mình gửi chúng ra cho người dùng :
1 2 3 4 5 | <span class="token variable">$localFiles</span> <span class="token operator">=</span> Storage<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">files</span><span class="token punctuation">(</span>‘files<span class="token operator">/</span>’ <span class="token punctuation">.</span> <span class="token function">auth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$s3Files</span> <span class="token operator">=</span> Storage<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">disk</span><span class="token punctuation">(</span>‘s3’<span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">files</span><span class="token punctuation">(</span>‘files<span class="token operator">/</span>’ <span class="token punctuation">.</span> <span class="token function">auth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">view</span><span class="token punctuation">(</span>‘home’<span class="token punctuation">,</span> <span class="token function">compact</span><span class="token punctuation">(</span>‘localFiles’<span class="token punctuation">,</span> ‘s3Files’<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Mình cũng cập nhật downloadFile của mình, chỉ định rằng muốn tải xuống và truyền tệp từ S3 thay vì hệ thống tệp cục bộ. Chúng tôi chỉ xâu chuỗi một cuộc gọi đĩa (‘s3) đến cả hai mặt tiền Storage và FileVault.
đây là những gì mình xử lý trong Controller :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Http<span class="token punctuation"></span>Controllers</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Jobs<span class="token punctuation"></span>EncryptFile</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Jobs<span class="token punctuation"></span>MoveFileToS3</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Http<span class="token punctuation"></span>Request</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Support<span class="token punctuation"></span>Facades<span class="token punctuation"></span>Storage</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation"></span>Support<span class="token punctuation"></span>Str</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">SoareCostin<span class="token punctuation"></span>FileVault<span class="token punctuation"></span>Facades<span class="token punctuation"></span>FileVault</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">HomeController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span> <span class="token punctuation">{</span> <span class="token comment">/** * Create a new controller instance. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">middleware</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'auth'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Show the application dashboard. * * @return IlluminateContractsSupportRenderable */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">index</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$localFiles</span> <span class="token operator">=</span> Storage<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">files</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'files/'</span> <span class="token punctuation">.</span> <span class="token function">auth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$s3Files</span> <span class="token operator">=</span> Storage<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">disk</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'s3'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">files</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'files/'</span> <span class="token punctuation">.</span> <span class="token function">auth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">view</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'home'</span><span class="token punctuation">,</span> <span class="token function">compact</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'localFiles'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'s3Files'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Store a user uploaded file * * @param IlluminateHttpRequest $request * @return IlluminateHttpResponse */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">store</span><span class="token punctuation">(</span>Request <span class="token variable">$request</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">hasFile</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'userFile'</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">file</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'userFile'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">isValid</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$filename</span> <span class="token operator">=</span> Storage<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">putFile</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'files/'</span> <span class="token punctuation">.</span> <span class="token function">auth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">,</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">file</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'userFile'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// check if we have a valid file uploaded</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> EncryptFile<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">withChain</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token keyword">new</span> <span class="token class-name">MoveFileToS3</span><span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token function">redirect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">route</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'home'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">with</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'message'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'Upload complete'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Download a file * * @param string $filename * @return IlluminateHttpResponse */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">downloadFile</span><span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Basic validation to check if the file exists and is in the user directory</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Storage<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">disk</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'s3'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">has</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'files/'</span> <span class="token punctuation">.</span> <span class="token function">auth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/'</span> <span class="token punctuation">.</span> <span class="token variable">$filename</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">abort</span><span class="token punctuation">(</span><span class="token number">404</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token function">response</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">streamDownload</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">use</span> <span class="token punctuation">(</span><span class="token variable">$filename</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> FileVault<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">disk</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'s3'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">streamDecrypt</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'files/'</span> <span class="token punctuation">.</span> <span class="token function">auth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">user</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span> <span class="token punctuation">.</span> <span class="token single-quoted-string string">'/'</span> <span class="token punctuation">.</span> <span class="token variable">$filename</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> Str<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">replaceLast</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'.enc'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">''</span><span class="token punctuation">,</span> <span class="token variable">$filename</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- Điều cuối cùng chúng ta cần làm là cập nhật home.blade.php, để chúng ta có thể hiển thị không chỉ các tệp người dùng đã được mã hóa và được lưu trữ vào S3 mà cả các tệp đang được mã hóa và tải lên S3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token operator"><</span>h4<span class="token operator">></span>Your files<span class="token operator"><</span><span class="token operator">/</span>h4<span class="token operator">></span> <span class="token operator"><</span>ul <span class="token keyword">class</span><span class="token operator">=</span><span class="token double-quoted-string string">"list-group"</span><span class="token operator">></span> @forelse <span class="token punctuation">(</span><span class="token variable">$s3Files</span> <span class="token keyword">as</span> <span class="token variable">$file</span><span class="token punctuation">)</span> <span class="token operator"><</span>li <span class="token keyword">class</span><span class="token operator">=</span><span class="token double-quoted-string string">"list-group-item"</span><span class="token operator">></span> <span class="token operator"><</span>a href<span class="token operator">=</span><span class="token double-quoted-string string">"{{ route('downloadFile', basename(<span class="token interpolation"><span class="token variable">$file</span></span>)) }}"</span><span class="token operator">></span> <span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token function">basename</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>a<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>li<span class="token operator">></span> @empty <span class="token operator"><</span>li <span class="token keyword">class</span><span class="token operator">=</span><span class="token double-quoted-string string">"list-group-item"</span><span class="token operator">></span>You have no files<span class="token operator"><</span><span class="token operator">/</span>li<span class="token operator">></span> @endforelse <span class="token operator"><</span><span class="token operator">/</span>ul<span class="token operator">></span> @<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token variable">$localFiles</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator"><</span>hr <span class="token operator">/</span><span class="token operator">></span> <span class="token operator"><</span>h4<span class="token operator">></span>Uploading <span class="token keyword">and</span> encrypting<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token operator"><</span><span class="token operator">/</span>h4<span class="token operator">></span> <span class="token operator"><</span>ul <span class="token keyword">class</span><span class="token operator">=</span><span class="token double-quoted-string string">"list-group"</span><span class="token operator">></span> @<span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$localFiles</span> <span class="token keyword">as</span> <span class="token variable">$file</span><span class="token punctuation">)</span> <span class="token operator"><</span>li <span class="token keyword">class</span><span class="token operator">=</span><span class="token double-quoted-string string">"list-group-item"</span><span class="token operator">></span> <span class="token punctuation">{</span><span class="token punctuation">{</span> <span class="token function">basename</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>li<span class="token operator">></span> @<span class="token keyword">endforeach</span> <span class="token operator"><</span><span class="token operator">/</span>ul<span class="token operator">></span> @<span class="token keyword">endif</span> |
6. Queue Configuration
- Nếu bạn không thực hiện bất kỳ thay đổi nào đối với cấu hình hàng đợi, rất có thể bạn đang sử dụng đồng bộ (sync) được đặt mặc định trong Laravel. queue config
- câu lệnh tạo model queue
1 2 3 | php artisan queue<span class="token punctuation">:</span>table php artisan migrate |
- sau đó chúng ta sẽ update QUEUE_CONNECTION trong file .env .
1 2 | QUEUE_CONNECTION=database |
- Tiếp theo chúng ta cần start queue :
1 2 | php artisan queue<span class="token punctuation">:</span>work <span class="token operator">--</span>tries<span class="token operator">=</span><span class="token number">3</span> |
7 Tổng kết
- Bây giờ để kiểm tra những thay đổi, khi bạn tải lên một tập tin, bạn sẽ thấy rằng tập tin đó được hiển thị ngay lập tức trong phần Tải lên và mã hóa mã hóa trực tuyến.