<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Hasban Fardani]]></title><description><![CDATA[Hi, i'am a fullstack engineer from Indonesia. Currently i study at SMKN 11 Bandung majoring in software development.]]></description><link>https://blog.hasbanfardani.my.id</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1717948972109/b025a163-ca66-42f5-91a2-5c3a56a5636a.png</url><title>Hasban Fardani</title><link>https://blog.hasbanfardani.my.id</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 12 May 2026 14:10:39 GMT</lastBuildDate><atom:link href="https://blog.hasbanfardani.my.id/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Cara Termudah Membuat fitur upload dan download file di Laravel 10.X]]></title><description><![CDATA[Terkadang dalam membuat sebuah aplikasi fullstack kita memerlukan sebuah fitur untuk upload dan mendownload sebuah file. Di laravel sendiri terdapat banyak sekali cara yang bisa kamu gunakan, namun bagaimana cara 'termudah' yang bisa kita lakukan? Be...]]></description><link>https://blog.hasbanfardani.my.id/cara-termudah-membuat-fitur-upload-dan-download-file-di-laravel-10x</link><guid isPermaLink="true">https://blog.hasbanfardani.my.id/cara-termudah-membuat-fitur-upload-dan-download-file-di-laravel-10x</guid><category><![CDATA[Laravel]]></category><dc:creator><![CDATA[Hasban Fardani]]></dc:creator><pubDate>Sat, 11 May 2024 08:20:17 GMT</pubDate><content:encoded><![CDATA[<p>Terkadang dalam membuat sebuah aplikasi fullstack kita memerlukan sebuah fitur untuk upload dan mendownload sebuah file. Di laravel sendiri terdapat banyak sekali cara yang bisa kamu gunakan, namun bagaimana cara 'termudah' yang bisa kita lakukan? Berikut saya berikan contohnya</p>
<h2 id="heading-membuat-aplikasi-laravel">Membuat Aplikasi Laravel</h2>
<p>sebelum masuk ke fitur utama mari kita membuat aplikasi laravelnya terlebih dahulu dengan menajalankan perintah</p>
<pre><code class="lang-bash">composer create-project laravel/laravel=10.0.0 UploadDownload
</code></pre>
<p>setelah selesai buka folder aplikasi menggunakan text editor favorit kalian, di sini saya menggunakan vscode.</p>
<h2 id="heading-konfigurasi-env">Konfigurasi .env</h2>
<p>buka file .env lalu masukkan nama database dan username beserta password mysql kalian, berikut contoh file .env saya</p>
<pre><code class="lang-plaintext">DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_file_manajement
DB_USERNAME=root
DB_PASSWORD=
</code></pre>
<h2 id="heading-link-storage">Link storage</h2>
<p>laravel memiliki package Storage yang sangat membantu dalam menghandle file file storage, namun sebelum itu kita harus melakukan symlink terlebih dahulu agar nantinya file kita bisa diakses oleh public.</p>
<pre><code class="lang-bash">php artisan storage:link
</code></pre>
<h2 id="heading-membuat-model-migration-dan-controller">Membuat Model, Migration dan Controller</h2>
<p>ketikan perintah berikut</p>
<pre><code class="lang-bash">php artisan make:model File -m --api
</code></pre>
<p>Penjelasan: <code>-m</code> adalah flag untuk membuat migration dan <code>--api</code> adalah untuk membuat apiResource.</p>
<h2 id="heading-migration-file">Migration file</h2>
<p>tuliskan kode berikut didalam method <code>up</code> pada migration yang baru saja kita buat</p>
<pre><code class="lang-php">Schema::create(<span class="hljs-string">'files'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">Blueprint $table</span>) </span>{
    $table-&gt;id();
    $table-&gt;string(<span class="hljs-string">'name'</span>);    
    $table-&gt;string(<span class="hljs-string">'path'</span>);
    $table-&gt;timestamps();
});
</code></pre>
<h2 id="heading-migrate-database">Migrate Database</h2>
<pre><code class="lang-bash">php artisan migrate
</code></pre>
<h2 id="heading-buat-kode-untuk-fitur-upload">Buat kode untuk Fitur upload</h2>
<p>buka FileController</p>
<p>buat kode seperti berikut</p>
<pre><code class="lang-php"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">upload</span>(<span class="hljs-params">Request $request</span>)
</span>{
    $validator = Validator::make($request-&gt;all(), [
        <span class="hljs-string">'name'</span> =&gt; <span class="hljs-string">'required'</span>,
        <span class="hljs-string">'file'</span> =&gt; <span class="hljs-string">'required|file'</span>
    ]);

    <span class="hljs-keyword">if</span> ($validator-&gt;fails()){
        <span class="hljs-keyword">return</span> response()-&gt;json([
            <span class="hljs-string">'message'</span> =&gt; <span class="hljs-string">'invalid field'</span>,
            <span class="hljs-string">'errors'</span> =&gt; $validator-&gt;errors()
        ]);
    }

    <span class="hljs-comment">// Mendapatkan file dari request</span>
    $file = $request-&gt;file(<span class="hljs-string">'file'</span>);
    <span class="hljs-comment">// membuat nama file sesuai dengan input request + ext file asli</span>
    $filename = $request-&gt;input(<span class="hljs-string">'name'</span>).<span class="hljs-string">'.'</span>.$file-&gt;getClientOriginalExtension();
    <span class="hljs-comment">// store file di folder public</span>
    $path = $file-&gt;storeAs(<span class="hljs-string">'/'</span>, name: $filename, options: <span class="hljs-string">'public'</span>);  
    <span class="hljs-comment">// menyimpan data ke database</span>
    $file = File::create([
        <span class="hljs-string">'path'</span> =&gt; $path,
        <span class="hljs-string">'name'</span> =&gt; $request-&gt;input(<span class="hljs-string">'name'</span>)
    ]);

    <span class="hljs-keyword">return</span> response()-&gt;json([
        <span class="hljs-string">'file'</span> =&gt; $file
    ]);
}
</code></pre>
<p>Mari kita fokus pada bagian kode ini</p>
<pre><code class="lang-php"><span class="hljs-comment">// Mendapatkan file dari request</span>
$file = $request-&gt;file(<span class="hljs-string">'file'</span>);
<span class="hljs-comment">// membuat nama file sesuai dengan input request + ext file asli</span>
$filename = $request-&gt;input(<span class="hljs-string">'name'</span>).<span class="hljs-string">'.'</span>.$file-&gt;getClientOriginalExtension();
<span class="hljs-comment">// store file di folder public</span>
$path = $file-&gt;storeAs(<span class="hljs-string">'/'</span>, name: $filename, options: <span class="hljs-string">'public'</span>);
</code></pre>
<p>pada kode tersebut pertama - tama kita mengambil file dari <code>$request</code> dengan nama <code>'file'</code> lalu kita simpan file menggunakan method <code>storeAs()</code> yang memiliki 3 parameter yaitu <mark>path, $filename, dan options</mark>. path adalah parameter wajib sedangkan yang lain adalah optional.</p>
<p><code>options: 'public'</code> didapat dari config disks yang berada pada file config/filesystem.php</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715414857688/fd75836e-8444-4454-874e-73cca42e6009.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-routes-api">Routes API</h3>
<p>buka file routes/api.php lalu kita buat route untuk upload file</p>
<pre><code class="lang-php">Route::post(<span class="hljs-string">'upload'</span>, [FileController::class, <span class="hljs-string">'upload'</span>]);
</code></pre>
<h3 id="heading-testing-aplikasi">Testing aplikasi</h3>
<ol>
<li><p>jalankan perintah <code>php artisan server</code></p>
</li>
<li><p>buat request dengan method post ke url http://localhost:8000/upload</p>
</li>
<li><p>ubah body menjadi <em>form-data</em> lalu masukkan data berupa name dan file</p>
</li>
<li><p>untuk file kita perlu ubah tipenya menjadi file</p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715413572896/9c48c983-96d6-47fc-8381-c1e5b14c6afd.png" alt class="image--center mx-auto" /></p>
<p> Hasilnya kurang lebih akan seperti ini:</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715415032934/e7f8f7d0-b74d-4a02-a0d5-a6b55056ba34.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-buat-fitur-untuk-download">Buat fitur untuk Download</h2>
<h3 id="heading-setting-route">Setting Route</h3>
<p>buka kembali file api.php lalu tambahkan kode berikut</p>
<pre><code class="lang-php">Route::get(<span class="hljs-string">'download/{file:name}'</span>, [FileController::class, <span class="hljs-string">'download'</span>]);
</code></pre>
<h3 id="heading-tambahkan-method-download-pada-filecontroller">Tambahkan method download pada FileController</h3>
<p>buka kembali FileController lalu tambahkan kode berikut</p>
<pre><code class="lang-php"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">download</span>(<span class="hljs-params">File $file</span>)
</span>{    
    <span class="hljs-keyword">return</span> response()-&gt;download(Storage::disk(<span class="hljs-string">'public'</span>)-&gt;path($file-&gt;path));
}
</code></pre>
<h3 id="heading-testing-postman">Testing postman</h3>
<p>buka postman lalu buat request get dengan url http://localhost:8000/api/test_file1 (sesuaikan dengan nama file pada req sebelumnya)</p>
<p>maka hasilnya kurang lebih akan seperti ini</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715415137573/f9154eeb-4789-42cc-8c55-f75d6f4df6e5.png" alt class="image--center mx-auto" /></p>
<p>atau jika anda membukanya lewat browser maka akan otomatis terdownload atau muncul popup file manajer seperti ini</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1715415200634/aca5ce84-daa0-488c-8d6b-2d42addf7c53.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-kesimpulan">Kesimpulan</h2>
<ol>
<li><p>untuk menyimpan file di laravel anda harus melakukan symlink terlebih dahulu agar folder storage public dapat diakses secara public</p>
</li>
<li><p>gunakan <code>$request-&gt;file('nama_file')-&gt;storeAs($path, $name, $option)</code> untuk menyimpan file dengan nama kostum dengan path dan options yang bisa disesuaikan</p>
</li>
<li><p>untuk mendapatkan path dari file public yang sudah diupload anda harus menggunakan <code>Storage::disk('public')-&gt;path('path');</code></p>
</li>
</ol>
<p>Terimakasih sudah membaca mohon maaf masih banyak kekurangan.</p>
<p>Jangan lupa titik koma;</p>
<p>:)</p>
]]></content:encoded></item></channel></rss>