{"id":12216,"date":"2024-01-07T07:00:46","date_gmt":"2024-01-06T22:00:46","guid":{"rendered":"https:\/\/blog.capilano-fw.com\/?p=12216"},"modified":"2023-12-29T17:50:30","modified_gmt":"2023-12-29T08:50:30","slug":"laravel-%e3%81%a7%e3%80%8c%e3%83%91%e3%82%b9%e3%83%af%e3%83%bc%e3%83%89%e4%bb%98%e3%81%8d-zip-%e5%8c%96%e3%80%8d%e3%81%99%e3%82%8b-storage-%e3%83%89%e3%83%a9%e3%82%a4%e3%83%90%e3%83%bc%e3%82%92","status":"publish","type":"post","link":"https:\/\/blog.capilano-fw.com\/?p=12216","title":{"rendered":"Laravel \u3067\u300c\u30d1\u30b9\u30ef\u30fc\u30c9\u4ed8\u304d zip \u5316\u300d\u3059\u308b Storage \u30c9\u30e9\u30a4\u30d0\u30fc\u3092\u3064\u304f\u308b"},"content":{"rendered":"<p>\u3055\u3066\u3055\u3066\u3001\u79c1\u306f\u5c11\u3057\u3060\u3051\u9577\u304f\u3053\u306e\u696d\u754c\u306b\u3044\u308b\u3093\u3067\u3059\u3051\u3069\u3001\u305d\u308c\u3067\u3082\u307e\u3060\u300c<strong>\u304a\u3063\u3001\u305d\u3093\u306a\u306e\u3042\u308b\u3093\u3060\ud83d\ude2f<\/strong>\u300d\u3068\u3044\u3046\u60c5\u5831\u306b\u51fa\u4f1a\u3063\u305f\u308a\u3082\u3057\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u51fa\u4f1a\u3063\u305f\u306e\u306f\u5927\u597d\u304d\u306a<code>Laravel<\/code>\u306b\u6a19\u6e96\u642d\u8f09\u3055\u308c\u3066\u3044\u308b\u6a5f\u80fd\u306a\u3093\u3067\u3059\u304c\u3001\u3069\u3046\u3084\u3089<strong>\u72ec\u81ea\u306b\u62e1\u5f35\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308b<\/strong>\u3089\u3057\u3044\u3093\u3067\u3059\u3002<\/p>\n<p>\u305d\u306e\u6a5f\u80fd\u306f\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n<p><strong style=\"font-size: 35px;\">Storage \u6a5f\u80fd<\/strong><\/p>\n<p>\u3067\u3059\u3002<\/p>\n<p><code>Storage<\/code>\u6a5f\u80fd\u306f\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u7c21\u5358\u306b\u4fdd\u5b58\u3057\u305f\u308a\u53d6\u308a\u51fa\u3057\u305f\u308a\u3067\u304d\u308b\u6a5f\u80fd\u306a\u3093\u3067\u3059\u304c\u3001\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3060\u3051\u3067<code>AWS<\/code>\u306e<code>S3<\/code>\u306b\u3060\u3063\u3066\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\uff06\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u30b9\u30b0\u30ec\u30e2\u30ce\u3067\u3059\u3002<\/p>\n<p>\u305d\u3057\u3066\u3001\u4eca\u56de\u306f\u3053\u306e<code>Storage<\/code>\u3092\u4f7f\u3063\u3066\u300c<strong>\u30d5\u30a1\u30a4\u30eb\u304c\u4fdd\u5b58\u3055\u308c\u305f\u3089\u81ea\u52d5\u7684\u306b\u30d1\u30b9\u30ef\u30fc\u30c9\u4ed8\u304d zip \u5316<\/strong>\u300d\u3059\u308b\u3088\u3046\u306b\u3057\u305f\u304f\u306a\u3063\u305f\u3093\u3067\u3059\u306d\u3002<\/p>\n<p>\u3064\u307e\u308a\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u3066\u300c\u30d1\u30b9\u30ef\u30fc\u30c9\u3064\u304d<code>zip<\/code>\u300d\u3092\u3064\u304f\u308a\u305f\u3044\u3093\u3067\u3059\u3002<\/p>\n<div>\n<pre>Storage::disk('<strong>password_zip<\/strong>')-&gt;put($file_name, $contents); \/\/ \ud83d\udc48 \u81ea\u52d5\u3067\u30d1\u30b9\u30ef\u30fc\u30c9\u3064\u304d zip \u304c\u4fdd\u5b58\u3055\u308c\u308b<\/pre>\n<p>\u305d\u3053\u3067\u2757<\/p>\n<p><code>Laravel<\/code>\u306e<code>Storage<\/code>\u3092\u72ec\u81ea\u306b\u62e1\u5f35\u3057\u3066\u3001\u300c<strong>\u30d1\u30b9\u30ef\u30fc\u30c9\u3064\u304d zip<\/strong>\u300d\u304c\u81ea\u52d5\u3067\u4f5c\u6210\u3055\u308c\u308b\u6a5f\u80fd\u3092\u5b9f\u88c5\u3057\u3066\u307f\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u305c\u3072\u4f55\u304b\u306e\u53c2\u8003\u306b\u306a\u308a\u307e\u3057\u305f\u3089\u5b09\u3057\u3044\u3067\u3059\u3002\ud83d\ude04\u2728<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9238 aligncenter\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2021\/06\/no_4.png\" alt=\"\" width=\"318\" height=\"320\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2021\/06\/no_4.png 318w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2021\/06\/no_4-298x300.png 298w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2021\/06\/no_4-150x150.png 150w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2021\/06\/no_4-100x100.png 100w\" sizes=\"auto, (max-width: 318px) 100vw, 318px\" \/>\u300c\u96fb\u5b50\u5e33\u7c3f\u4fdd\u5b58\u6cd5\u3001<br \/>\n\u30ac\u30c1\u3067\u3081\u3093\u3069\u3046\u2026<br \/>\n\u307f\u3093\u306a\u3001\u30db\u30f3\u30c8\u306b\u3084\u308b\u306e\uff1f\uff1f\u300d<\/p>\n<p>\u958b\u767a\u74b0\u5883\uff1a<\/p>\n<\/div>\n<h1>\u72ec\u81ea\u306e FilesystemAdapter \u3092\u3064\u304f\u308b<\/h1>\n<p>\u3067\u306f\u3001\u3044\u304d\u306a\u308a\u3067\u3059\u304c<code>Storage<\/code>\u3092\u300c<strong>\u30d1\u30b9\u30ef\u30fc\u30c9\u3064\u304d zip<\/strong>\u300d\u306b\u5bfe\u5fdc\u3057\u305f\u72ec\u81ea\u306e\u30a2\u30c0\u30d7\u30bf\u30fc\u3092\u3064\u304f\u3063\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><strong>app\/Filesystem\/PasswordZipAdapter.php<\/strong><\/p>\n<div>\n<pre><strong>&lt;?php<\/strong>\r\n\r\n<strong>namespace App\\Filesystem;<\/strong>\r\n\r\n<strong>use Illuminate\\Support\\Str;<\/strong>\r\n<strong>use League\\Flysystem\\Config;<\/strong>\r\n<strong>use League\\Flysystem\\FileAttributes;<\/strong>\r\n<strong>use League\\Flysystem\\FilesystemAdapter;<\/strong>\r\n<strong>use ZipArchive;<\/strong>\r\n<strong>use Exception;<\/strong>\r\n\r\n<strong>class PasswordZipAdapter implements FilesystemAdapter<\/strong>\r\n<strong>{<\/strong>\r\n<strong>    public function __construct()<\/strong>\r\n<strong>    {<\/strong>\r\n<strong>        $this-&gt;password = config('filesystems.disks.password_zip.password');<\/strong>\r\n\r\n<strong>        if(Str::length($this-&gt;password) &lt; 8) {<\/strong>\r\n\r\n<strong>            throw new Exception('\u30d1\u30b9\u30ef\u30fc\u30c9\u306f8\u6587\u5b57\u4ee5\u4e0a\u3067\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002');<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n<strong>    }<\/strong>\r\n\r\n<strong>    \/\/ \u30c6\u30ad\u30b9\u30c8\u304b\u3089\u4fdd\u5b58\u3059\u308b\u5834\u5408\uff08 put() \u306a\u3069 \uff09<\/strong>\r\n<strong>    public function write(string $path, string $contents, Config $config): void<\/strong>\r\n<strong>    {<\/strong>\r\n<strong>        $this-&gt;makeZipFile($path, $contents);<\/strong>\r\n<strong>    }<\/strong>\r\n\r\n<strong>    \/\/ \u30d5\u30a1\u30a4\u30eb\u304b\u3089\u4fdd\u5b58\u3059\u308b\u5834\u5408\uff08 putFile(), putFileAs() \u306a\u3069 \uff09<\/strong>\r\n<strong>    public function writeStream(string $path, $contents, Config $config): void<\/strong>\r\n<strong>    {<\/strong>\r\n<strong>        $this-&gt;makeZipFile($path, $contents);<\/strong>\r\n<strong>    }<\/strong>\r\n\r\n<strong>    public function read(string $path): string<\/strong>\r\n<strong>    {<\/strong>\r\n<strong>        $zip_path = $this-&gt;getRootPath($path .'.zip');<\/strong>\r\n\r\n<strong>        $zip = new ZipArchive();<\/strong>\r\n<strong>        $zip-&gt;open($zip_path);<\/strong>\r\n<strong>        $zip-&gt;setPassword($this-&gt;password);<\/strong>\r\n<strong>        $contents = $zip-&gt;getFromIndex(0);<\/strong>\r\n<strong>        $zip-&gt;close();<\/strong>\r\n\r\n<strong>        return $contents;<\/strong>\r\n<strong>    }<\/strong>\r\n\r\n<strong>    private function getRootPath(string $path = ''): string<\/strong>\r\n<strong>    {<\/strong>\r\n<strong>        $root_path = config('filesystems.disks.password_zip.root');<\/strong>\r\n\r\n<strong>        if(! file_exists($root_path)) {<\/strong>\r\n\r\n<strong>            mkdir($root_path, 0777, true);<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>        return $root_path .'\/'. $path;<\/strong>\r\n<strong>    }<\/strong>\r\n\r\n<strong>    private function makeZipFile(string $path, mixed $contents): bool<\/strong>\r\n<strong>    {<\/strong>\r\n<strong>        $filename = basename($path);<\/strong>\r\n<strong>        $zip_path = $this-&gt;getRootPath($path .'.zip');<\/strong>\r\n<strong>        $tmp_path = tempnam(sys_get_temp_dir(), 'zip_');<\/strong>\r\n<strong>        file_put_contents($tmp_path, $contents);<\/strong>\r\n\r\n<strong>        try {<\/strong>\r\n\r\n<strong>            $zip = new ZipArchive();<\/strong>\r\n<strong>            $zip-&gt;open($zip_path, ZipArchive::CREATE);<\/strong>\r\n<strong>            $zip-&gt;setPassword($this-&gt;password);<\/strong>\r\n<strong>            $zip-&gt;addFile($tmp_path, $filename);<\/strong>\r\n<strong>            $zip-&gt;setEncryptionName($filename, ZipArchive::EM_TRAD_PKWARE);<\/strong>\r\n<strong>            $zip-&gt;close();<\/strong>\r\n\r\n<strong>            @unlink($tmp_path); \/\/ \u5143\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664<\/strong>\r\n\r\n<strong>        } catch (Exception $e) {<\/strong>\r\n\r\n<strong>            throw $e;<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>        return true;<\/strong>\r\n<strong>    }<\/strong>\r\n\r\n<strong>    \/\/ \u4ee5\u964d\u306f\u3001\u4eca\u56de\u5b9f\u88c5\u3057\u306a\u3044\u90e8\u5206\u3067\u3059\u304c Flysystem \u3067\u5fc5\u8981\u306a\u30e1\u30bd\u30c3\u30c9\u306a\u306e\u3067\u6b8b\u3057\u3066\u3044\u307e\u3059<\/strong>\r\n<strong>    public function fileExists(string $path): bool<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function directoryExists(string $path): bool<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function readStream(string $path)<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function delete(string $path): void<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function deleteDirectory(string $path): void<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function createDirectory(string $path, Config $config): void<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function setVisibility(string $path, string $visibility): void<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function visibility(string $path): FileAttributes<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function mimeType(string $path): FileAttributes<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function lastModified(string $path): FileAttributes<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function fileSize(string $path): FileAttributes<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function listContents(string $path, bool $deep): iterable<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function move(string $source, string $destination, Config $config): void<\/strong>\r\n<strong>    {}<\/strong>\r\n\r\n<strong>    public function copy(string $source, string $destination, Config $config): void<\/strong>\r\n<strong>    {}<\/strong>\r\n<strong>}<\/strong><\/pre>\n<p>\u3061\u306a\u307f\u306b\u4eca\u56de\u306e\u300c<strong>\u30d1\u30b9\u30ef\u30fc\u30c9\u4ed8\u304dzip<\/strong>\u300d\u30c9\u30e9\u30a4\u30d0\u30fc\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u3066\u4f7f\u3044\u307e\u3059\u304c\u3001\u305d\u308c\u305e\u308c<code>write()<\/code>\u3068<code>writeStream()<\/code>\u304c\u547c\u3070\u308c\u3001\u6700\u7d42\u7684\u306b\u306f<code>makeZipFile()<\/code>\u3067\u5408\u6d41\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><strong>\u30fbwrite() \u304c\u547c\u3070\u308c\u308b\u5834\u5408<\/strong><\/p>\n<div>\n<pre><strong>Storage::disk('password_zip')-&gt;put($file_name, $contents);<\/strong><\/pre>\n<p><strong>\u30fbwriteStream() \u304c\u547c\u3070\u308c\u308b\u5834\u5408<\/strong><\/p>\n<div>\n<pre><strong>Storage::disk('password_zip')-&gt;putFileAs('', $file, $file_name);<\/strong><\/pre>\n<p>\u307e\u305f\u3001\u30b3\u30fc\u30c9\u304c\u5165\u3063\u3066\u3044\u306a\u3044\u7b87\u6240\u304c\u3042\u308a\u307e\u3059\u304c\u3053\u308c\u306f\u901a\u5e38\u306e<code>Storage<\/code>\u304c\u4f7f\u3048\u308b\u306e\u3067\u7701\u7565\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/div>\n<\/div>\n<\/div>\n<h1>AppServiceProvider \u3078\u767b\u9332\u3059\u308b<\/h1>\n<p>\u3067\u306f\u6b21\u306b\u3001\u5148\u307b\u3069\u306e<code>PasswordZipAdapter<\/code>\u3092\u6709\u52b9\u306b\u3057\u307e\u3059\u3002<\/p>\n<p><strong>app\/Providers\/AppServiceProvider.php<\/strong><\/p>\n<div>\n<pre>&lt;?php\r\n\r\nnamespace App\\Providers;\r\n\r\n<strong>use Illuminate\\Contracts\\Foundation\\Application;<\/strong>\r\n<strong>use Illuminate\\Filesystem\\FilesystemAdapter;<\/strong>\r\n<strong>use Illuminate\\Support\\Facades\\Storage;<\/strong>\r\nuse Illuminate\\Support\\ServiceProvider;\r\n<strong>use League\\Flysystem\\Filesystem;<\/strong>\r\n<strong>use App\\Filesystem\\PasswordZipAdapter;<\/strong>\r\n\r\nclass AppServiceProvider extends ServiceProvider\r\n{\r\n    \/**\r\n     * Register any application services.\r\n     *\/\r\n    public function register(): void\r\n    {\r\n        \/\/\r\n    }\r\n\r\n    \/**\r\n     * Bootstrap any application services.\r\n     *\/\r\n    public function boot(): void\r\n    {\r\n        <strong>Storage::extend('password_zip', function (Application $app, array $config) {<\/strong>\r\n\r\n<strong>            $adapter = new PasswordZipAdapter();<\/strong>\r\n\r\n<strong>            return new FilesystemAdapter(<\/strong>\r\n<strong>                new Filesystem($adapter, $config),<\/strong>\r\n<strong>                $adapter,<\/strong>\r\n<strong>                $config<\/strong>\r\n<strong>            );<\/strong>\r\n\r\n<strong>        });<\/strong>\r\n    }\r\n}<\/pre>\n<\/div>\n<h1>\u30b3\u30f3\u30d5\u30a3\u30b0\u306b\u767b\u9332\u3059\u308b<\/h1>\n<p>\u305d\u3057\u3066\u3001\u30b3\u30f3\u30d5\u30a3\u30b0\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u30bb\u30c3\u30c8\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><strong>config\/filesystems.php<\/strong><\/p>\n<div>\n<pre>\/\/ \u7701\u7565\r\n\r\n'disks' =&gt; [\r\n\r\n    \/\/ \u7701\u7565\r\n\r\n<strong>    'password_zip' =&gt; [<\/strong>\r\n<strong>        'driver' =&gt; 'password_zip',<\/strong>\r\n<strong>        'root' =&gt; storage_path('app\/password_zip_files'), \/\/ \ud83d\udc48 \u30eb\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0<\/strong>\r\n<strong>        'password' =&gt; 'my-password', \/\/ \ud83d\udc48 \u672c\u6765\u306f .env \u3067\u7ba1\u7406\u3059\u308b<\/strong>\r\n<strong>    ],<\/strong><\/pre>\n<\/div>\n<h1>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3092\u3064\u304f\u308b<\/h1>\n<p>\u3067\u306f\u3001\u3053\u3053\u307e\u3067\u3067\u4f5c\u3063\u305f\u72ec\u81ea\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u3092\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306b\u30bb\u30c3\u30c8\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p>\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\n<pre><strong>php artisan make:controller PasswordZipController<\/strong><\/pre>\n<p>\u3059\u308b\u3068<code>app\/Http\/Controllers\/<\/code>\u306b\u30d5\u30a1\u30a4\u30eb\u304c\u4f5c\u6210\u3055\u308c\u308b\u306e\u3067\u4e2d\u8eab\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n<p><strong>app\/Http\/Controllers\/PasswordZipController.php<\/strong><\/p>\n<div>\n<pre><strong>&lt;?php<\/strong>\r\n\r\n<strong>namespace App\\Http\\Controllers;<\/strong>\r\n\r\n<strong>use Illuminate\\Http\\Request;<\/strong>\r\n<strong>use Illuminate\\Support\\Facades\\Storage;<\/strong>\r\n\r\n<strong>class PasswordZipController extends Controller<\/strong>\r\n<strong>{<\/strong>\r\n<strong>    public function create()<\/strong>\r\n<strong>    {<\/strong>\r\n<strong>        return view('password_zip.create');<\/strong>\r\n<strong>    }<\/strong>\r\n\r\n<strong>    public function store(Request $request)<\/strong>\r\n<strong>    {<\/strong>\r\n<strong>        \/\/ \u6ce8\uff1a \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u306f\u7701\u7565\u3057\u3066\u3044\u307e\u3059<\/strong>\r\n\r\n<strong>        if($request-&gt;hasFile('image')) {<\/strong>\r\n\r\n<strong>            $file = $request-&gt;file('image');<\/strong>\r\n<strong>            $file_name = $file-&gt;getClientOriginalName();<\/strong>\r\n\r\n<strong>            \/\/ \u30d5\u30a1\u30a4\u30eb\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u4ed8\u304d zip \u30d5\u30a1\u30a4\u30eb\u306b\u3057\u3066\u4fdd\u5b58<\/strong>\r\n<strong>            Storage::disk('password_zip')-&gt;putFileAs('', $file, $file_name);<\/strong>\r\n\r\n<strong>            \/\/ \u753b\u50cf\u30c7\u30fc\u30bf\u3092\u53d6\u5f97<\/strong>\r\n<strong>            $image_data = Storage::disk('password_zip')-&gt;get($file_name);<\/strong>\r\n\r\n<strong>            return response($image_data)-&gt;header('Content-Type', 'image\/jpeg');<\/strong>\r\n\r\n<strong>        } else if($request-&gt;has(['file_name', 'contents'])) {<\/strong>\r\n\r\n<strong>            $file_name = $request-&gt;file_name;<\/strong>\r\n<strong>            $contents = $request-&gt;contents;<\/strong>\r\n\r\n<strong>            \/\/ \u30d5\u30a1\u30a4\u30eb\u3092\u30d1\u30b9\u30ef\u30fc\u30c9\u4ed8\u304d zip \u30d5\u30a1\u30a4\u30eb\u306b\u3057\u3066\u4fdd\u5b58<\/strong>\r\n<strong>            Storage::disk('password_zip')-&gt;put($file_name, $contents);<\/strong>\r\n\r\n<strong>            \/\/ \u30c6\u30ad\u30b9\u30c8\u30c7\u30fc\u30bf\u3092\u53d6\u5f97<\/strong>\r\n<strong>            $contents = Storage::disk('password_zip')-&gt;get($file_name);<\/strong>\r\n\r\n<strong>            return response($contents)-&gt;header('Content-Type', 'text\/plain');<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n<strong>    }<\/strong>\r\n<strong>}<\/strong><\/pre>\n<p>\u306a\u304a\u3001\u4eca\u56de\u306f\u30c6\u30b9\u30c8\u3067\u3059\u306e\u3067\u3001\u4e00\u65e6\u30d1\u30b9\u30ef\u30fc\u30c9\u3064\u304d<code>zip<\/code>\u3068\u3057\u3066\u4fdd\u5b58\u3057\u307e\u3059\u304c\u3001\u3059\u3050\u306b\u305d\u306e\u4e2d\u304b\u3089\u30c7\u30fc\u30bf\u3092\u53d6\u308a\u51fa\u3057\u3066<code>return<\/code>\u3059\u308b\u3088\u3046\u306b\u3057\u3066\u307e\u3059\u3002<\/p>\n<\/div>\n<h1>\u30d3\u30e5\u30fc\u3092\u3064\u304f\u308b<\/h1>\n<p>\u7d9a\u3044\u3066\u5148\u307b\u3069\u306e\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u30bb\u30c3\u30c8\u3057\u305f\u30d3\u30e5\u30fc\u3092\u3064\u304f\u308a\u307e\u3059\u3002<br \/>\n\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div>\n<pre><strong>php artisan make:view password_zip.create<\/strong><\/pre>\n<p>\u3059\u308b\u3068\u3001<code>resources\/views\/password_zip\/<\/code>\u306b\u30d5\u30a1\u30a4\u30eb\u304c\u4f5c\u6210\u3055\u308c\u308b\u306e\u3067\u4e2d\u8eab\u3092\u6b21\u306e\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<p><strong>resources\/views\/password_zip\/create.blade.php<\/strong><\/p>\n<div>\n<pre><strong>&lt;!DOCTYPE html&gt;<\/strong>\r\n<strong>&lt;html lang=\"ja\"&gt;<\/strong>\r\n<strong>&lt;head&gt;<\/strong>\r\n<strong>    &lt;meta charset=\"UTF-8\"&gt;<\/strong>\r\n<strong>    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;<\/strong>\r\n<strong>    &lt;title&gt;Laravel Sample Form&lt;\/title&gt;<\/strong>\r\n<strong>    &lt;script src=\"https:\/\/cdn.tailwindcss.com\/3.3.5\"&gt;&lt;\/script&gt;<\/strong>\r\n<strong>&lt;\/head&gt;<\/strong>\r\n<strong>&lt;body class=\"bg-gray-100 p-8\"&gt;<\/strong>\r\n<strong>&lt;div class=\"max-w-md mx-auto\"&gt;<\/strong>\r\n<strong>    &lt;!-- \u30c6\u30ad\u30b9\u30c8\u9001\u4fe1\u30d5\u30a9\u30fc\u30e0 --&gt;<\/strong>\r\n<strong>    &lt;form action=\"{{ route('password_zip.store') }}\" method=\"POST\" class=\"bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4\"&gt;<\/strong>\r\n<strong>        @csrf<\/strong>\r\n<strong>        &lt;div class=\"mb-4\"&gt;<\/strong>\r\n<strong>            &lt;label class=\"block text-gray-700 text-sm font-bold mb-2\"&gt;\u30d5\u30a1\u30a4\u30eb\u540d&lt;\/label&gt;<\/strong>\r\n<strong>            &lt;input name=\"file_name\" type=\"text\" class=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline\" required&gt;<\/strong>\r\n<strong>        &lt;\/div&gt;<\/strong>\r\n<strong>        &lt;div class=\"mb-4\"&gt;<\/strong>\r\n<strong>            &lt;label class=\"block text-gray-700 text-sm font-bold mb-2\"&gt;\u30c6\u30ad\u30b9\u30c8&lt;\/label&gt;<\/strong>\r\n<strong>            &lt;input name=\"contents\" type=\"text\" class=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline\" required&gt;<\/strong>\r\n<strong>        &lt;\/div&gt;<\/strong>\r\n<strong>        &lt;div class=\"flex items-center justify-between\"&gt;<\/strong>\r\n<strong>            &lt;button type=\"submit\" class=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline\"&gt;<\/strong>\r\n<strong>                \u9001\u4fe1<\/strong>\r\n<strong>            &lt;\/button&gt;<\/strong>\r\n<strong>        &lt;\/div&gt;<\/strong>\r\n<strong>    &lt;\/form&gt;<\/strong>\r\n\r\n<strong>    &lt;!-- \u30d5\u30a1\u30a4\u30eb\u9001\u4fe1\u30d5\u30a9\u30fc\u30e0 --&gt;<\/strong>\r\n<strong>    &lt;form action=\"{{ route('password_zip.store') }}\" method=\"POST\" enctype=\"multipart\/form-data\" class=\"bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4\"&gt;<\/strong>\r\n<strong>        @csrf<\/strong>\r\n<strong>        &lt;div class=\"mb-4\"&gt;<\/strong>\r\n<strong>            &lt;label class=\"block text-gray-700 text-sm font-bold mb-2\"&gt;\u30d5\u30a1\u30a4\u30eb&lt;\/label&gt;<\/strong>\r\n<strong>            &lt;input name=\"image\" type=\"file\" class=\"shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline\" required&gt;<\/strong>\r\n<strong>        &lt;\/div&gt;<\/strong>\r\n<strong>        &lt;div class=\"flex items-center justify-between\"&gt;<\/strong>\r\n<strong>            &lt;button type=\"submit\" class=\"bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline\"&gt;<\/strong>\r\n<strong>                \u9001\u4fe1<\/strong>\r\n<strong>            &lt;\/button&gt;<\/strong>\r\n<strong>        &lt;\/div&gt;<\/strong>\r\n<strong>    &lt;\/form&gt;<\/strong>\r\n<strong>&lt;\/div&gt;<\/strong>\r\n<strong>&lt;\/body&gt;<\/strong>\r\n<strong>&lt;\/html&gt;<\/strong><\/pre>\n<h1>\u30eb\u30fc\u30c8\u3092\u3064\u304f\u308b<\/h1>\n<p>\u3067\u306f\u3001\u6700\u5f8c\u306b\u30eb\u30fc\u30c8\u3067\u3059\u3002<\/p>\n<p><strong>routes\/web.php<\/strong><\/p>\n<div>\n<pre>use App\\Http\\Controllers\\PasswordZipController;\r\n\r\n\/\/ \u7701\u7565\r\n\r\n<strong>Route::prefix('password_zip')-&gt;controller(PasswordZipController::class)-&gt;group(function(){<\/strong>\r\n\r\n<strong>    Route::get('create', 'create')-&gt;name('password_zip.create');<\/strong>\r\n<strong>    Route::post('store', 'store')-&gt;name('password_zip.store');<\/strong>\r\n\r\n<strong>});<\/strong><\/pre>\n<p>\u3053\u308c\u3067\u4f5c\u696d\u306f\u5b8c\u4e86\u3067\u3059\u3002<br \/>\n\u304a\u75b2\u308c\u69d8\u3067\u3057\u305f\ud83d\ude04\u2728<\/p>\n<\/div>\n<\/div>\n<\/div>\n<h1>\u3061\u306a\u307f\u306b\uff1aIDE \u306b\u300cZipArchive\u300d\u306e\u8b66\u544a\u304c\u3067\u308b\u5834\u5408<\/h1>\n<p>\u79c1\u306e\u5834\u5408<code>phpstorm<\/code>\u3092\u611b\u7528\u3057\u3066\u3044\u308b\u306e\u3067\u3059\u304c\uff08\u6700\u8fd1\u306f<code>Cursor<\/code>\u3082\u4eba\u6c17\u3042\u308b\u307f\u305f\u3044\u3067\u3059\u306d\uff09<code>ZipArchive<\/code>\u3092\u4f7f\u3046\u3068\u8b66\u544a\u304c\u3067\u308b\u3088\u3046\u3067\u3057\u305f\u3002<\/p>\n<p>\u7279\u306b\u5b9f\u884c\u306b\u306f\u5f71\u97ff\u306a\u3044\u306e\u3067\u6c17\u306b\u306a\u3089\u306a\u3044\u5834\u5408\u306f\u30b9\u30eb\u30fc\u3057\u3066\u3044\u3044\u3068\u601d\u3046\u3093\u3067\u3059\u3051\u3069\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3059\u308b\u3068\u8b66\u544a\u304c\u6d88\u3048\u307e\u3057\u305f\u306e\u3067\u3001\u6c17\u306b\u306a\u308b\u4eba\u306f\u305c\u3072\u3084\u3063\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p><strong>composer.json<\/strong><\/p>\n<div>\n<pre>\"require\": {\r\n    \r\n\u3000\u3000# \u7701\u7565\r\n\r\n    <strong>\"ext-zip\": \"*\"<\/strong>\r\n},<\/pre>\n<h1>\u30c6\u30b9\u30c8\u3057\u3066\u307f\u308b<\/h1>\n<\/div>\n<p>\u3067\u306f\u3001\u5b9f\u969b\u306b\u30c6\u30b9\u30c8\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u307e\u305a\u306f\u30d6\u30e9\u30a6\u30b6\u3067\u300c<strong>http:\/\/******\/password_zip\/create<\/strong>\u300d\u3078\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002<\/p>\n<p>\u3059\u308b\u3068\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30d5\u30a9\u30fc\u30e0\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12226\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_1.png\" alt=\"\" width=\"485\" height=\"497\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_1.png 485w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_1-293x300.png 293w\" sizes=\"auto, (max-width: 485px) 100vw, 485px\" \/><\/p>\n<p>\u3067\u306f\u3001\u307e\u305a\u306f\u4e0a\u306e\u30d5\u30a9\u30fc\u30e0\uff08\u6587\u5b57\u304b\u3089<code>Storage<\/code>\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3059\u308b\u30d1\u30bf\u30fc\u30f3\uff09\u3078\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5165\u529b\u3057\u3066\u9001\u4fe1\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12225\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_2.png\" alt=\"\" width=\"480\" height=\"290\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_2.png 480w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_2-300x181.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<p>\u3059\u308b\u3068\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12224\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_3.png\" alt=\"\" width=\"179\" height=\"37\" \/><\/p>\n<p>\u306f\u3044\u2757<\/p>\n<p>\u4eca\u56de\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u4ed8\u304d<code>zip<\/code>\u3092\u3064\u304f\u3063\u3066\u3059\u3050\u306b\u4e2d\u8eab\u3092\u53d6\u308a\u51fa\u3057\u3001\u305d\u306e\u5185\u5bb9\u3092\u8868\u793a\u3059\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u9001\u4fe1\u3057\u305f\u30c6\u30ad\u30b9\u30c8\u304c\u8868\u793a\u3055\u308c\u307e\u3057\u305f\u3002<\/p>\n<p>\u305d\u3057\u3066\u3001<code>Storage<\/code>\u30d5\u30a9\u30eb\u30c0\u3092\u898b\u3066\u307f\u308b\u3068\u3001\u4ee5\u4e0b\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u4f5c\u6210\u3055\u308c\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12223\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_4.png\" alt=\"\" width=\"132\" height=\"145\" \/><\/p>\n<p>\u3067\u306f\u3001\u65e9\u901f\u4e2d\u8eab\u3092\u898b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12222\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_5.png\" alt=\"\" width=\"546\" height=\"458\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_5.png 546w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_5-300x252.png 300w\" sizes=\"auto, (max-width: 546px) 100vw, 546px\" \/><\/p>\n<p>\u306f\u3044\u2757<br \/>\n\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u4fdd\u8b77\u3055\u308c\u3066\u3044\u307e\u3057\u305f\u3002<\/p>\n<p>\u305d\u3057\u3066\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\uff08\u4eca\u56de\u306f\u300c<strong>my-password<\/strong>\u300d\uff09\u3092\u5165\u529b\u3057\u3066\u307f\u308b\u3068\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12221\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_6.png\" alt=\"\" width=\"448\" height=\"269\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_6.png 448w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_6-300x180.png 300w\" sizes=\"auto, (max-width: 448px) 100vw, 448px\" \/><\/p>\n<p>\u306f\u3044\u2757<br \/>\n\u3061\u3083\u3093\u3068\u4e2d\u8eab\u3092\u3068\u308a\u3060\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n<p>\u6210\u529f\u3067\u3059\ud83d\ude04<\/p>\n<p>\u3067\u306f\u7d9a\u3044\u3066\u30d5\u30a1\u30a4\u30eb\u9078\u629e\u30d5\u30a9\u30fc\u30e0\uff08\u30d5\u30a1\u30a4\u30eb\u3092\u9001\u4fe1\u3057\u3066<code>Storage<\/code>\u4fdd\u5b58\u3059\u308b\u30d1\u30bf\u30fc\u30f3\uff09\u3067\u3059\u3002<\/p>\n<p>\u203b \u4eca\u56de\u306f\u798f\u5d0e\u753a\u306b\u3042\u308b\u304a\u6c17\u306b\u5165\u308a\u306e\u5510\u63da\u3052\u300c\u307f\u306e\u3084\u300d\u306e\u5199\u771f\u3092\u4f7f\u3063\u3066\u3084\u3063\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12227\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/minoya_karaage.png\" alt=\"\" width=\"300\" height=\"400\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/minoya_karaage.png 300w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/minoya_karaage-225x300.png 225w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12228\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_7.png\" alt=\"\" width=\"482\" height=\"220\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_7.png 482w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_7-300x137.png 300w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/p>\n<p>\u3046\u307e\u304f\u3044\u304f\u3067\u3057\u3087\u3046\u304b\u30fb\u30fb\u30fb\u30fb\u30fb\u30fb<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12229\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_9.png\" alt=\"\" width=\"389\" height=\"166\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_9.png 389w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_9-300x128.png 300w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><\/p>\n<p>\u306f\u3044\u2757<br \/>\n\u5148\u307b\u3069\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u6a2a\u306b\u65b0\u3057\u304f\u30d5\u30a1\u30a4\u30eb\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-12230\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_10.png\" alt=\"\" width=\"607\" height=\"388\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_10.png 607w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2023\/11\/laravel_password_zip_storage_10-300x192.png 300w\" sizes=\"auto, (max-width: 607px) 100vw, 607px\" \/><\/p>\n<p>\u3082\u3061\u308d\u3093\u30d1\u30b9\u30ef\u30fc\u30c9\u3082\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\uff08\u89e3\u9664\u3082\u3067\u304d\u307e\u3057\u305f\uff09<\/p>\n<p>\u3059\u3079\u3066\u6210\u529f\u3067\u3059\u2728\ud83d\ude04\ud83d\udc4d<\/p>\n<h1>\u4f01\u696d\u69d8\u3078\u306e\u3054\u63d0\u6848<\/h1>\n<p>\u4eca\u56de\u306f\u300c<strong>\u30d1\u30b9\u30ef\u30fc\u30c9\u3064\u304d zip \u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210<\/strong>\u300d\u3067\u3057\u305f\u304c\u3001<code>Storage<\/code>\u6a5f\u80fd\u3092\u62e1\u5f35\u3059\u308b\u3068\u3044\u308d\u3044\u308d\u306a\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u4f8b\u3048\u3070\u3001\u72ec\u81ea\u306e\u30af\u30e9\u30a6\u30c9\u3092\u4f7f\u3063\u3066\u3044\u308b\u5834\u5408\u3084<code>AWS<\/code>\u3001<code>Google Cloud<\/code>\u307b\u3069\u8a8d\u77e5\u304c\u3042\u308b\u308f\u3051\u3067\u306f\u306a\u3044\u30af\u30e9\u30a6\u30c9\u30b5\u30fc\u30d3\u30b9\u3092\u4f7f\u3063\u3066\u3044\u308b\u5834\u5408\u3067\u3082\u3001\u72ec\u81ea\u30a2\u30c0\u30d7\u30bf\u30fc\u3092\u4f5c\u3063\u3066\u304a\u3051\u3070\u30b7\u30f3\u30d7\u30eb\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\uff06\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u6700\u7d42\u66f4\u65b0\u65e5\u306a\u3069\u4f4d\u7f6e\u60c5\u5831\u306a\u3069\u7279\u6b8a\u306a\u30c7\u30fc\u30bf\u8ffd\u52a0\u306a\u3069\u3082\u5bfe\u5fdc\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u3082\u3057\u305d\u3046\u3044\u3063\u305f\u6a5f\u80fd\u3092\u3054\u5e0c\u671b\u3067\u3057\u305f\u3089\u3044\u3064\u3067\u3082\u304a\u6c17\u8efd\u306e\u304a\u554f\u3044\u5408\u308f\u305b\u304b\u3089\u3054\u76f8\u8ac7\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u304a\u5f85\u3061\u3057\u3066\u304a\u308a\u307e\u3059\u3002\ud83d\ude04\u2728<\/p>\n<h1>\u304a\u308f\u308a\u306b<\/h1>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u4eca\u56de\u306f<code>Storage<\/code>\u3092\u62e1\u5f35\u3057\u3066\u300c<strong>\u30d1\u30b9\u30ef\u30fc\u30c9\u4ed8\u304d zip \u30d5\u30a1\u30a4\u30eb<\/strong>\u300d\u304c\u4f5c\u6210\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u4eca\u56de\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u300c<strong>my-password<\/strong>\u300d\u3060\u3063\u305f\u306e\u3067\u3068\u3066\u3082\u77ed\u3044\u3067\u3059\u304c\u3001\u91cd\u8981\u306a\u30d5\u30a1\u30a4\u30eb\u306e\u5834\u5408\u306f\u3082\u3063\u3068\u9577\u304f\u3001\u8907\u96d1\u306a\u3082\u306e\u306b\u3057\u3066\u304a\u3051\u3070\u3088\u308a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u5f37\u304f\u306a\u308b\u3067\u3057\u3087\u3046\u3057\u3001\u305d\u3046\u306a\u308b\u3068\u304d\u3063\u3068\u5b89\u5fc3\u611f\u3082\u5897\u3048\u308b\u3093\u3058\u3083\u306a\u3044\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\n<p>\u203b \u3061\u306a\u307f\u306b\u3001\u3082\u3057\u91cf\u5b50\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u304c\u30b8\u30e3\u30f3\u30b8\u30e3\u30f3\u4f7f\u308f\u308c\u308b\u3088\u3046\u306b\u306a\u3063\u305f\u3089\u3053\u306e\u90e8\u5206\u3082\u5bfe\u5fdc\u304c\u5fc5\u8981\u306b\u306a\u3063\u3066\u304f\u308b\u3093\u3067\u3057\u3087\u3046\u306d\u3002\u79d1\u5b66\u306e\u9032\u6b69\u306f\u65e9\u3044\u3067\u3059\u304b\u3089\u3002<\/p>\n<p>\u3068\u306f\u3044\u3048\u3001\u305c\u3072\u7686\u3055\u3093\u3082<code>Storage<\/code>\u3092\u72ec\u81ea\u306b\u62e1\u5f35\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u306d\u3002<\/p>\n<p>\u3067\u306f\u3067\u306f\u301c\u2757<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-6066 aligncenter\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2020\/03\/no_23.png\" alt=\"\" width=\"370\" height=\"320\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2020\/03\/no_23.png 370w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2020\/03\/no_23-300x259.png 300w\" sizes=\"auto, (max-width: 370px) 100vw, 370px\" \/>\u300c\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3055\u3093\u9054\u3078\u306e<br \/>\n\u304a\u6b73\u66ae\u3001\u4f55\u306b\u3057\u3088\u3046\u304b\u306a\u2026\uff1f\uff1f\u300d<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3055\u3066\u3055\u3066\u3001\u79c1\u306f\u5c11\u3057\u3060\u3051\u9577\u304f\u3053\u306e\u696d\u754c\u306b\u3044\u308b\u3093\u3067\u3059\u3051\u3069\u3001\u305d\u308c\u3067\u3082\u307e\u3060\u300c\u304a\u3063\u3001\u305d\u3093\u306a\u306e\u3042\u308b\u3093\u3060\ud83d\ude2f\u300d\u3068\u3044\u3046\u60c5\u5831\u306b\u51fa\u4f1a\u3063\u305f\u308a\u3082\u3057\u307e\u3059\u3002 \u4eca\u56de\u51fa\u4f1a\u3063\u305f\u306e\u306f\u5927\u597d\u304d\u306aLarav &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.capilano-fw.com\/?p=12216\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;Laravel \u3067\u300c\u30d1\u30b9\u30ef\u30fc\u30c9\u4ed8\u304d zip \u5316\u300d\u3059\u308b Storage \u30c9\u30e9\u30a4\u30d0\u30fc\u3092\u3064\u304f\u308b&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":12233,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-12216","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel"],"_links":{"self":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/12216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12216"}],"version-history":[{"count":6,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/12216\/revisions"}],"predecessor-version":[{"id":12232,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/12216\/revisions\/12232"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/media\/12233"}],"wp:attachment":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}