{"id":3211,"date":"2025-03-24T08:46:39","date_gmt":"2025-03-23T23:46:39","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=3211"},"modified":"2025-03-24T08:47:10","modified_gmt":"2025-03-23T23:47:10","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel-storage%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a%e5%9f%ba%e7%a4%8e%e3%81%8b%e3%82%89%e5%ae%9f%e8%b7%b5%e3%81%be%e3%81%a715","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=3211","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel Storage\u306e\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u307e\u306715\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel Storage\u3068\u306f\uff1a\u57fa\u790e\u6982\u5ff5\u3092\u7406\u89e3\u3059\u308b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u30d5\u30a1\u30a4\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u30b7\u30b9\u30c6\u30e0\u306e\u5168\u4f53\u50cf<\/a>      <\/li>      <li>        <a href=\"#i-2\">Laravel Storage\u304c\u89e3\u6c7a\u3059\u308b3\u3064\u306e\u8ab2\u984c<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">\u5f93\u6765\u306ePHP\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u3068\u306e\u6bd4\u8f03<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">Laravel Storage\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u57fa\u672c\u8a2d\u5b9a<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30ebconfig\/filesystems.php\u306e\u8a73\u7d30\u89e3\u8aac<\/a>      <\/li>      <li>        <a href=\"#i-6\">\u30ed\u30fc\u30ab\u30eb\u30c7\u30a3\u30b9\u30af\u3068\u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u30b9\u30c8\u30ec\u30fc\u30b8\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u9078\u629e\u3068\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u5b9f\u8df5\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u30bb\u30ad\u30e5\u30a2\u306a\u30d5\u30a1\u30a4\u30eb\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306e\u5b9f\u73fe\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u52b9\u7387\u7684\u306a\u6271\u3044\u65b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u6700\u9069\u5316<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">\u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u30b9\u30c8\u30ec\u30fc\u30b8\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u6d3b\u7528\u3057\u305f\u8aad\u307f\u66f8\u304d\u306e\u9ad8\u901f\u5316<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">\u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u3068\u306e\u9023\u643a\u5b9f\u88c5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">AWS S3\u3068\u306e\u9023\u643a\u8a2d\u5b9a\u3068\u4f7f\u3044\u65b9<\/a>      <\/li>      <li>        <a href=\"#i-18\">Google Cloud Storage\u306e\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">\u30de\u30eb\u30c1\u30af\u30e9\u30a6\u30c9\u74b0\u5883\u3067\u306e\u904b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-20\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u3088\u304f\u3042\u308b\u554f\u984c\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-22\">\u52b9\u679c\u7684\u306a\u30ed\u30b0\u8a2d\u5b9a\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">\u672c\u756a\u74b0\u5883\u3067\u306e\u6ce8\u610f\u70b9\u3068\u5bfe\u7b56<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel Storage\u3068\u306f\uff1a\u57fa\u790e\u6982\u5ff5\u3092\u7406\u89e3\u3059\u308b<\/h2>\n\n\n\n<p>Laravel Storage\u306f\u3001Laravel\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u7d44\u307f\u8fbc\u307e\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u62bd\u8c61\u5316\u30ec\u30a4\u30e4\u30fc\u3067\u3059\u3002\u3053\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306b\u3088\u308a\u3001\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u3084\u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9\u3092\u7d71\u4e00\u7684\u306a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3067\u64cd\u4f5c\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u30d5\u30a1\u30a4\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u30b7\u30b9\u30c6\u30e0\u306e\u5168\u4f53\u50cf<\/h3>\n\n\n\n<p>Laravel Storage\u306f\u3001Flysystem\u3068\u3044\u3046\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u30d9\u30fc\u30b9\u306b\u69cb\u7bc9\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u4ee5\u4e0b\u304c\u4e3b\u8981\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3068\u7279\u5fb4\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b9\u30c8\u30ec\u30fc\u30b8\u30c9\u30e9\u30a4\u30d0\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ed\u30fc\u30ab\u30eb\u30c9\u30e9\u30a4\u30d0\u30fc\uff1a\u30b5\u30fc\u30d0\u30fc\u4e0a\u306e\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u3092\u64cd\u4f5c<\/li>\n\n\n\n<li>AWS\u30c9\u30e9\u30a4\u30d0\u30fc\uff1aAmazon S3\u3068\u306e\u9023\u643a<\/li>\n\n\n\n<li>FTP\u30c9\u30e9\u30a4\u30d0\u30fc\uff1aFTP\u30b5\u30fc\u30d0\u30fc\u3068\u306e\u9023\u643a<\/li>\n\n\n\n<li>\u305d\u306e\u4ed6\uff1aGoogle Cloud Storage\u3001Azure Blob\u306a\u3069<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30a3\u30b9\u30af\uff08Disk\uff09\u306e\u6982\u5ff5<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7269\u7406\u7684\u306a\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u62bd\u8c61\u5316<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u7c21\u5358\u306b\u5207\u308a\u66ff\u3048\u53ef\u80fd<\/li>\n\n\n\n<li>\u8907\u6570\u306e\u30c7\u30a3\u30b9\u30af\u3092\u540c\u6642\u306b\u5229\u7528\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u7d71\u4e00\u3055\u308c\u305fAPI<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u540c\u3058\u30e1\u30bd\u30c3\u30c9\u3067\u7570\u306a\u308b\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u64cd\u4f5c\nStorage::disk('local')-&gt;put('file.txt', 'Content');\nStorage::disk('s3')-&gt;put('file.txt', 'Content');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Laravel Storage\u304c\u89e3\u6c7a\u3059\u308b3\u3064\u306e\u8ab2\u984c<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u4f9d\u5b58\u6027\u554f\u984c<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f93\u6765\uff1a\u7279\u5b9a\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u4f9d\u5b58\u3057\u305f\u30b3\u30fc\u30c9\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>\u89e3\u6c7a\u7b56\uff1a\u62bd\u8c61\u5316\u30ec\u30a4\u30e4\u30fc\u306b\u3088\u308b\u7d71\u4e00\u7684\u306a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/li>\n\n\n\n<li>\u30e1\u30ea\u30c3\u30c8\uff1a\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u5207\u308a\u66ff\u3048\u304c\u5bb9\u6613\u306b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f93\u6765\uff1a\u76f4\u63a5\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u64cd\u4f5c\u306b\u3088\u308b\u30ea\u30b9\u30af<\/li>\n\n\n\n<li>\u89e3\u6c7a\u7b56\uff1a\u5b89\u5168\u306a\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u751f\u6210\u3068\u691c\u8a3c<\/li>\n\n\n\n<li>\u30e1\u30ea\u30c3\u30c8\uff1a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30db\u30fc\u30eb\u306e\u9632\u6b62<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u88c5\u306e\u8907\u96d1\u3055<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f93\u6765\uff1a\u5404\u30b9\u30c8\u30ec\u30fc\u30b8\u3054\u3068\u306b\u7570\u306a\u308b\u5b9f\u88c5\u304c\u5fc5\u8981<\/li>\n\n\n\n<li>\u89e3\u6c7a\u7b56\uff1a\u30b7\u30f3\u30d7\u30eb\u3067\u4e00\u8cab\u6027\u306e\u3042\u308bAPI<\/li>\n\n\n\n<li>\u30e1\u30ea\u30c3\u30c8\uff1a\u958b\u767a\u52b9\u7387\u306e\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u5f93\u6765\u306ePHP\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u3068\u306e\u6bd4\u8f03<\/h3>\n\n\n\n<p><strong>1. \u57fa\u672c\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306e\u6bd4\u8f03<\/strong><\/p>\n\n\n\n<p>\u5f93\u6765\u306ePHP\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d5\u30a1\u30a4\u30eb\u66f8\u304d\u8fbc\u307f\n$content = 'Hello World';\nfile_put_contents('\/path\/to\/file.txt', $content);\n\n\/\/ \u30d5\u30a1\u30a4\u30eb\u8aad\u307f\u8fbc\u307f\n$content = file_get_contents('\/path\/to\/file.txt');<\/pre>\n\n\n\n<p>Laravel Storage\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d5\u30a1\u30a4\u30eb\u66f8\u304d\u8fbc\u307f\nStorage::put('file.txt', 'Hello World');\n\n\/\/ \u30d5\u30a1\u30a4\u30eb\u8aad\u307f\u8fbc\u307f\n$content = Storage::get('file.txt');<\/pre>\n\n\n\n<p><strong>2. \u4e3b\u8981\u306a\u9055\u3044\u3068\u5229\u70b9<\/strong><\/p>\n\n\n<div id=\"id-7c5ed180-808d-463a-ab7d-fde8cc3009e0\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6a5f\u80fd<\/th><th>\u5f93\u6765\u306ePHP<\/th><th>Laravel Storage<\/th><\/tr><\/thead><tbody><tr><td>\u30d1\u30b9\u6307\u5b9a<\/td><td>\u7d76\u5bfe\/\u76f8\u5bfe\u30d1\u30b9\u304c\u5fc5\u8981<\/td><td>\u8ad6\u7406\u30d1\u30b9\u3067\u6307\u5b9a\u53ef\u80fd<\/td><\/tr><tr><td>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/td><td>try-catch\u304c\u5fc5\u9808<\/td><td>\u7d71\u4e00\u7684\u306a\u4f8b\u5916\u51e6\u7406<\/td><\/tr><tr><td>\u30b9\u30c8\u30ec\u30fc\u30b8\u5207\u66ff<\/td><td>\u30b3\u30fc\u30c9\u5909\u66f4\u304c\u5fc5\u8981<\/td><td>\u8a2d\u5b9a\u5909\u66f4\u306e\u307f<\/td><\/tr><tr><td>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/td><td>\u81ea\u524d\u3067\u5b9f\u88c5\u304c\u5fc5\u8981<\/td><td>\u6a19\u6e96\u3067\u5bfe\u5fdc\u6e08\u307f<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p><strong>3. \u5b9f\u88c5\u306e\u67d4\u8edf\u6027<\/strong><\/p>\n\n\n\n<p>Laravel Storage\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u9ad8\u5ea6\u306a\u64cd\u4f5c\u3082\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d5\u30a1\u30a4\u30eb\u306e\u5b58\u5728\u78ba\u8a8d\nif (Storage::exists('file.txt')) {\n    \/\/ \u51e6\u7406\n}\n\n\/\/ \u30d5\u30a1\u30a4\u30eb\u306eURL\u53d6\u5f97\n$url = Storage::url('file.txt');\n\n\/\/ \u30d5\u30a1\u30a4\u30eb\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u53d6\u5f97\n$size = Storage::size('file.txt');\n$lastModified = Storage::lastModified('file.txt');<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u3001Laravel Storage\u306f\u5f93\u6765\u306ePHP\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3057\u3001\u3088\u308a\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u969b\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u57fa\u672c\u8a2d\u5b9a\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">Laravel Storage\u306e\u74b0\u5883\u69cb\u7bc9\u3068\u57fa\u672c\u8a2d\u5b9a<\/h2>\n\n\n\n<p>Laravel Storage\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u9069\u5207\u306a\u74b0\u5883\u69cb\u7bc9\u3068\u8a2d\u5b9a\u304c\u4e0d\u53ef\u6b20\u3067\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5177\u4f53\u7684\u306a\u8a2d\u5b9a\u65b9\u6cd5\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30ebconfig\/filesystems.php\u306e\u8a73\u7d30\u89e3\u8aac<\/h3>\n\n\n\n<p>Laravel Storage\u306e\u8a2d\u5b9a\u306f\u3001<code>config\/filesystems.php<\/code>\u3067\u7ba1\u7406\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u4e3b\u8981\u306a\u8a2d\u5b9a\u9805\u76ee\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d5\u30a9\u30eb\u30c8\u30c7\u30a3\u30b9\u30af\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">'default' =&gt; env('FILESYSTEM_DISK', 'local'),<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30a3\u30b9\u30af\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">'disks' =&gt; [\n    'local' =&gt; [\n        'driver' =&gt; 'local',\n        'root' =&gt; storage_path('app'),\n        'throw' =&gt; false,\n    ],\n\n    'public' =&gt; [\n        'driver' =&gt; 'local',\n        'root' =&gt; storage_path('app\/public'),\n        'url' =&gt; env('APP_URL').'\/storage',\n        'visibility' =&gt; 'public',\n        'throw' =&gt; false,\n    ],\n\n    's3' =&gt; [\n        'driver' =&gt; 's3',\n        'key' =&gt; env('AWS_ACCESS_KEY_ID'),\n        'secret' =&gt; env('AWS_SECRET_ACCESS_KEY'),\n        'region' =&gt; env('AWS_DEFAULT_REGION'),\n        'bucket' =&gt; env('AWS_BUCKET'),\n        'url' =&gt; env('AWS_URL'),\n        'endpoint' =&gt; env('AWS_ENDPOINT'),\n        'use_path_style_endpoint' =&gt; env('AWS_USE_PATH_STYLE_ENDPOINT', false),\n        'throw' =&gt; false,\n    ],\n],<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30b7\u30f3\u30dc\u30ea\u30c3\u30af\u30ea\u30f3\u30af\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">'links' =&gt; [\n    public_path('storage') =&gt; storage_path('app\/public'),\n],<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u30ed\u30fc\u30ab\u30eb\u30c7\u30a3\u30b9\u30af\u3068\u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>1. \u30ed\u30fc\u30ab\u30eb\u30c7\u30a3\u30b9\u30af\u306e\u8a2d\u5b9a<\/strong><\/p>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u30ed\u30fc\u30ab\u30eb\u30c7\u30a3\u30b9\u30af\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/filesystems.php\n'disks' =&gt; [\n    'custom' =&gt; [\n        'driver' =&gt; 'local',\n        'root' =&gt; storage_path('app\/custom'),\n        'permissions' =&gt; [\n            'file' =&gt; [\n                'public' =&gt; 0664,\n                'private' =&gt; 0600,\n            ],\n            'dir' =&gt; [\n                'public' =&gt; 0775,\n                'private' =&gt; 0700,\n            ],\n        ],\n    ],\n],<\/pre>\n\n\n\n<p><strong>2. \u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8a2d\u5b9a<\/strong><\/p>\n\n\n\n<p>Amazon S3\u306e\u8a2d\u5b9a\u4f8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5fc5\u8981\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">composer require league\/flysystem-aws-s3-v3<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\uff08.env\uff09<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">AWS_ACCESS_KEY_ID=your-key-id\nAWS_SECRET_ACCESS_KEY=your-secret\nAWS_DEFAULT_REGION=your-region\nAWS_BUCKET=your-bucket<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30c7\u30a3\u30b9\u30af\u8a2d\u5b9a\u306e\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/filesystems.php\n's3' =&gt; [\n    'driver' =&gt; 's3',\n    \/\/ ... \u4ed6\u306e\u8a2d\u5b9a\n],<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u30b9\u30c8\u30ec\u30fc\u30b8\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u9078\u629e\u3068\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/h3>\n\n\n\n<p><strong>1. \u5229\u7528\u53ef\u80fd\u306a\u30c9\u30e9\u30a4\u30d0\u30fc<\/strong><\/p>\n\n\n<div id=\"id-3b2a43e5-0ea1-4aa1-ab04-84c509db6410\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u30c9\u30e9\u30a4\u30d0\u30fc<\/th><th>\u7528\u9014<\/th><th>\u5fc5\u8981\u30d1\u30c3\u30b1\u30fc\u30b8<\/th><\/tr><\/thead><tbody><tr><td>local<\/td><td>\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0<\/td><td>\u30c7\u30d5\u30a9\u30eb\u30c8\u642d\u8f09<\/td><\/tr><tr><td>ftp<\/td><td>FTP\u30b5\u30fc\u30d0\u30fc<\/td><td>league\/flysystem-ftp<\/td><\/tr><tr><td>sftp<\/td><td>SFTP\u30b5\u30fc\u30d0\u30fc<\/td><td>league\/flysystem-sftp-v3<\/td><\/tr><tr><td>s3<\/td><td>Amazon S3<\/td><td>league\/flysystem-aws-s3-v3<\/td><\/tr><tr><td>gcs<\/td><td>Google Cloud Storage<\/td><td>google\/cloud-storage<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p><strong>2. \u30c9\u30e9\u30a4\u30d0\u30fc\u9078\u629e\u306e\u57fa\u6e96<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\uff1a<code>local<\/code>\u30c9\u30e9\u30a4\u30d0\u30fc\u304c\u63a8\u5968<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\uff1a\u7528\u9014\u306b\u5fdc\u3058\u3066<code>s3<\/code>\u3084<code>gcs<\/code>\u3092\u9078\u629e<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8981\u4ef6\uff1a<code>sftp<\/code>\u306e\u4f7f\u7528\u3092\u691c\u8a0e<\/li>\n\n\n\n<li>\u30ec\u30ac\u30b7\u30fc\u30b7\u30b9\u30c6\u30e0\u9023\u643a\uff1a<code>ftp<\/code>\u30c9\u30e9\u30a4\u30d0\u30fc\u3092\u6d3b\u7528<\/li>\n<\/ul>\n\n\n\n<p><strong>3. \u30ab\u30b9\u30bf\u30e0\u30c9\u30e9\u30a4\u30d0\u30fc\u306e\u5b9f\u88c5<\/strong><\/p>\n\n\n\n<p>\u72ec\u81ea\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u30c9\u30e9\u30a4\u30d0\u30fc\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use League\\Flysystem\\FilesystemAdapter;\nuse Storage;\n\nclass CustomAdapter implements FilesystemAdapter\n{\n    \/\/ \u30a2\u30c0\u30d7\u30bf\u30fc\u306e\u5b9f\u88c5\n}\n\n\/\/ \u30b5\u30fc\u30d3\u30b9\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3067\u306e\u767b\u9332\nStorage::extend('custom', function ($app, $config) {\n    return new CustomAdapter($config);\n});<\/pre>\n\n\n\n<p>\u4ee5\u4e0a\u3067\u57fa\u672c\u7684\u306a\u74b0\u5883\u69cb\u7bc9\u3068\u8a2d\u5b9a\u306e\u89e3\u8aac\u3092\u7d42\u308f\u308a\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u8df5\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u5b9f\u8df5\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<p>Laravel Storage\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u8df5\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u64cd\u4f5c\u306b\u3064\u3044\u3066\u3001\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u65b9\u6cd5\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>1. \u57fa\u672c\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function store(Request $request)\n{\n    if ($request-&gt;hasFile('file')) {\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u540d\u3092\u5143\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u3067\u4fdd\u5b58\n        $path = $request-&gt;file('file')-&gt;store('uploads');\n\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u30d5\u30a1\u30a4\u30eb\u540d\u3067\u4fdd\u5b58\n        $customPath = $request-&gt;file('file')-&gt;storeAs(\n            'uploads',\n            time() . '_' . $request-&gt;file('file')-&gt;getClientOriginalName()\n        );\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u753b\u50cf\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306e\u5b9f\u88c5\u4f8b<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function uploadImage(Request $request)\n{\n    $request-&gt;validate([\n        'image' =&gt; 'required|image|mimes:jpeg,png,jpg,gif|max:2048'\n    ]);\n\n    try {\n        $image = $request-&gt;file('image');\n        $name = time() . '.' . $image-&gt;getClientOriginalExtension();\n\n        \/\/ \u516c\u958b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u4fdd\u5b58\n        $path = Storage::disk('public')-&gt;putFileAs(\n            'images',\n            $image,\n            $name\n        );\n\n        return response()-&gt;json([\n            'success' =&gt; true,\n            'path' =&gt; Storage::disk('public')-&gt;url($path)\n        ]);\n    } catch (\\Exception $e) {\n        return response()-&gt;json([\n            'success' =&gt; false,\n            'message' =&gt; $e-&gt;getMessage()\n        ], 500);\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u306e\u30c1\u30e3\u30f3\u30af\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function uploadChunk(Request $request)\n{\n    $chunkNumber = $request-&gt;input('chunk_number');\n    $totalChunks = $request-&gt;input('total_chunks');\n    $fileId = $request-&gt;input('file_id');\n\n    \/\/ \u30c1\u30e3\u30f3\u30af\u306e\u4e00\u6642\u4fdd\u5b58\n    $chunk = $request-&gt;file('chunk');\n    $chunkPath = \"chunks\/{$fileId}\/{$chunkNumber}\";\n    Storage::put($chunkPath, file_get_contents($chunk));\n\n    \/\/ \u5168\u30c1\u30e3\u30f3\u30af\u304c\u63c3\u3063\u305f\u3089\u7d50\u5408\n    if ($this-&gt;allChunksUploaded($fileId, $totalChunks)) {\n        $this-&gt;mergeChunks($fileId, $totalChunks);\n    }\n}\n\nprivate function mergeChunks($fileId, $totalChunks)\n{\n    $finalPath = \"uploads\/{$fileId}\";\n    $buffer = '';\n\n    for ($i = 0; $i &lt; $totalChunks; $i++) {\n        $chunkPath = \"chunks\/{$fileId}\/{$i}\";\n        $buffer .= Storage::get($chunkPath);\n        Storage::delete($chunkPath);\n    }\n\n    Storage::put($finalPath, $buffer);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30bb\u30ad\u30e5\u30a2\u306a\u30d5\u30a1\u30a4\u30eb\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306e\u5b9f\u73fe\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>1. \u8a8d\u8a3c\u4ed8\u304d\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function download($fileId)\n{\n    \/\/ \u30d5\u30a1\u30a4\u30eb\u306e\u5b58\u5728\u78ba\u8a8d\u3068\u6a29\u9650\u30c1\u30a7\u30c3\u30af\n    $file = File::findOrFail($fileId);\n    $this-&gt;authorize('download', $file);\n\n    if (!Storage::exists($file-&gt;path)) {\n        abort(404);\n    }\n\n    \/\/ \u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u56de\u6570\u306e\u8a18\u9332\u306a\u3069\u306e\u4ed8\u52a0\u7684\u306a\u51e6\u7406\n    $file-&gt;increment('download_count');\n\n    \/\/ \u30bb\u30ad\u30e5\u30a2\u306a\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306e\u5b9f\u884c\n    return Storage::download(\n        $file-&gt;path,\n        $file-&gt;original_name,\n        ['Content-Type' =&gt; $file-&gt;mime_type]\n    );\n}<\/pre>\n\n\n\n<p><strong>2. \u4e00\u6642\u7684\u306a\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9URL\u751f\u6210<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function getTemporaryUrl($fileId)\n{\n    $file = File::findOrFail($fileId);\n\n    \/\/ S3\u306e\u5834\u5408\u306e\u4e00\u6642URL\u751f\u6210\n    if (Storage::disk('s3')-&gt;exists($file-&gt;path)) {\n        return Storage::disk('s3')-&gt;temporaryUrl(\n            $file-&gt;path,\n            now()-&gt;addMinutes(5),\n            [\n                'ResponseContentDisposition' =&gt; 'attachment; filename=\"' . $file-&gt;original_name . '\"'\n            ]\n        );\n    }\n\n    \/\/ \u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u5834\u5408\u306e\u7f72\u540d\u4ed8\u304dURL\u751f\u6210\n    return URL::signedRoute(\n        'download',\n        ['file' =&gt; $file-&gt;id],\n        now()-&gt;addMinutes(5)\n    );\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u52b9\u7387\u7684\u306a\u6271\u3044\u65b9<\/h3>\n\n\n\n<p><strong>1. \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210\u3068\u7ba1\u7406<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class TemporaryFileManager\n{\n    public function store(UploadedFile $file)\n    {\n        $path = $file-&gt;store('temp');\n\n        \/\/ \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u60c5\u5831\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a18\u9332\n        return TemporaryFile::create([\n            'path' =&gt; $path,\n            'original_name' =&gt; $file-&gt;getClientOriginalName(),\n            'expires_at' =&gt; now()-&gt;addHours(24)\n        ]);\n    }\n\n    public function cleanup()\n    {\n        $expiredFiles = TemporaryFile::where('expires_at', '&lt;', now())-&gt;get();\n\n        foreach ($expiredFiles as $file) {\n            Storage::delete($file-&gt;path);\n            $file-&gt;delete();\n        }\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u3092\u6c38\u7d9a\u5316<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function makePermanent(TemporaryFile $tempFile, $destination)\n{\n    try {\n        \/\/ \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u3092\u6c38\u7d9a\u7684\u306a\u4fdd\u5b58\u5834\u6240\u306b\u79fb\u52d5\n        $newPath = Storage::move(\n            $tempFile-&gt;path,\n            $destination . '\/' . $tempFile-&gt;original_name\n        );\n\n        \/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u66f4\u65b0\n        $permanentFile = PermanentFile::create([\n            'path' =&gt; $newPath,\n            'original_name' =&gt; $tempFile-&gt;original_name\n        ]);\n\n        \/\/ \u4e00\u6642\u30d5\u30a1\u30a4\u30eb\u60c5\u5831\u306e\u524a\u9664\n        $tempFile-&gt;delete();\n\n        return $permanentFile;\n    } catch (\\Exception $e) {\n        \\Log::error('Failed to make file permanent: ' . $e-&gt;getMessage());\n        throw $e;\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u5b9a\u671f\u7684\u306a\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u306e\u5b9f\u88c5<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Console\/Commands\/CleanupTemporaryFiles.php\nclass CleanupTemporaryFiles extends Command\n{\n    protected $signature = 'files:cleanup';\n\n    public function handle(TemporaryFileManager $manager)\n    {\n        $manager-&gt;cleanup();\n    }\n}\n\n\/\/ app\/Console\/Kernel.php\nprotected function schedule(Schedule $schedule)\n{\n    $schedule-&gt;command('files:cleanup')-&gt;daily();\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u4f8b\u306f\u3001\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u4f7f\u7528\u3067\u304d\u308b\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u3067\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u6700\u9069\u5316\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u6700\u9069\u5316<\/h2>\n\n\n\n<p>Laravel Storage\u3092\u672c\u756a\u74b0\u5883\u3067\u52b9\u7387\u7684\u306b\u904b\u7528\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u4e21\u9762\u3067\u306e\u6700\u9069\u5316\u304c\u91cd\u8981\u3067\u3059\u3002\u3053\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5b9f\u8df5\u7684\u306a\u6700\u9069\u5316\u624b\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h3>\n\n\n\n<p><strong>1. \u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u975e\u52b9\u7387\u306a\u65b9\u6cd5\uff08\u30e1\u30e2\u30ea\u306b\u5168\u30c7\u30fc\u30bf\u3092\u4fdd\u6301\uff09\n$content = Storage::get('large-file.zip');\nStorage::disk('s3')-&gt;put('backup\/large-file.zip', $content);\n\n\/\/ \u52b9\u7387\u7684\u306a\u65b9\u6cd5\uff08\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\uff09\n$stream = Storage::readStream('large-file.zip');\nStorage::disk('s3')-&gt;writeStream('backup\/large-file.zip', $stream);\nif (is_resource($stream)) {\n    fclose($stream);\n}<\/pre>\n\n\n\n<p><strong>2. \u5927\u5bb9\u91cf\u30d5\u30a1\u30a4\u30eb\u306e\u30c1\u30e3\u30f3\u30af\u51e6\u7406<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class LargeFileProcessor\n{\n    private $chunkSize = 1024 * 1024; \/\/ 1MB\u5358\u4f4d\u3067\u51e6\u7406\n\n    public function process($filePath)\n    {\n        $stream = Storage::readStream($filePath);\n\n        while (!feof($stream)) {\n            $chunk = fread($stream, $this-&gt;chunkSize);\n            $this-&gt;processChunk($chunk);\n\n            \/\/ \u30e1\u30e2\u30ea\u89e3\u653e\n            if (gc_enabled()) {\n                gc_collect_cycles();\n            }\n        }\n\n        fclose($stream);\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u975e\u540c\u671f\u51e6\u7406\u306e\u6d3b\u7528<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d5\u30a1\u30a4\u30eb\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u51e6\u7406\u3092\u30ad\u30e5\u30fc\u306b\u6295\u5165\nclass ProcessLargeFile implements ShouldQueue\n{\n    public function handle()\n    {\n        \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u6642\u9593\u306e\u8a2d\u5b9a\n        set_time_limit(0);\n\n        \/\/ \u9032\u6357\u76e3\u8996\u4ed8\u304d\u306e\u51e6\u7406\n        $manager = new FileProcessManager();\n        $manager-&gt;processWithProgress($this-&gt;filePath, function ($progress) {\n            Cache::put(\"file_progress_{$this-&gt;fileId}\", $progress, 3600);\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30b9\u30c8\u30ec\u30fc\u30b8\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>1. \u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u306e\u57fa\u672c\u8a2d\u5b9a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/filesystems.php\nreturn [\n    'disks' =&gt; [\n        'private' =&gt; [\n            'driver' =&gt; 'local',\n            'root' =&gt; storage_path('app\/private'),\n            'visibility' =&gt; 'private',\n            'permissions' =&gt; [\n                'file' =&gt; [\n                    'public' =&gt; 0644,\n                    'private' =&gt; 0600,\n                ],\n                'dir' =&gt; [\n                    'public' =&gt; 0755,\n                    'private' =&gt; 0700,\n                ],\n            ],\n        ],\n    ],\n];<\/pre>\n\n\n\n<p><strong>2. \u30bb\u30ad\u30e5\u30a2\u306a\u30d5\u30a1\u30a4\u30eb\u30a2\u30af\u30bb\u30b9\u5236\u5fa1<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SecureFileController extends Controller\n{\n    public function download($fileId)\n    {\n        $file = File::findOrFail($fileId);\n\n        \/\/ \u6a29\u9650\u30c1\u30a7\u30c3\u30af\n        if (!auth()-&gt;user()-&gt;can('view', $file)) {\n            abort(403);\n        }\n\n        \/\/ \u30a2\u30af\u30bb\u30b9\u30ed\u30b0\u306e\u8a18\u9332\n        $this-&gt;logFileAccess($file);\n\n        \/\/ \u5b89\u5168\u306a\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\n        return Storage::download(\n            $file-&gt;path,\n            $file-&gt;original_name,\n            [\n                'Content-Type' =&gt; $file-&gt;mime_type,\n                'Content-Disposition' =&gt; 'attachment'\n            ]\n        );\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u30d5\u30a1\u30a4\u30eb\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class FileUploadRequest extends FormRequest\n{\n    public function rules()\n    {\n        return [\n            'file' =&gt; [\n                'required',\n                'file',\n                'mimes:jpeg,png,pdf,doc,docx',\n                'max:10240', \/\/ 10MB\n                function ($attribute, $value, $fail) {\n                    if (!$this-&gt;validateFileContent($value)) {\n                        $fail('\u30d5\u30a1\u30a4\u30eb\u306e\u5185\u5bb9\u304c\u4e0d\u6b63\u3067\u3059\u3002');\n                    }\n                },\n            ]\n        ];\n    }\n\n    private function validateFileContent($file)\n    {\n        \/\/ \u30a6\u30a4\u30eb\u30b9\u30b9\u30ad\u30e3\u30f3\u3084\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u306e\u691c\u8a3c\n        return true;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u6d3b\u7528\u3057\u305f\u8aad\u307f\u66f8\u304d\u306e\u9ad8\u901f\u5316<\/h3>\n\n\n\n<p><strong>1. \u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u30ad\u30e3\u30c3\u30b7\u30e5<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class FileMetadata\n{\n    public function get($path)\n    {\n        $cacheKey = \"file_meta_{$path}\";\n\n        return Cache::remember($cacheKey, 3600, function () use ($path) {\n            return [\n                'size' =&gt; Storage::size($path),\n                'modified' =&gt; Storage::lastModified($path),\n                'mime' =&gt; Storage::mimeType($path),\n            ];\n        });\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u983b\u7e41\u306b\u30a2\u30af\u30bb\u30b9\u3055\u308c\u308b\u30d5\u30a1\u30a4\u30eb\u306e\u6700\u9069\u5316<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OptimizedFileService\n{\n    public function serveFile($path)\n    {\n        \/\/ \u30a2\u30af\u30bb\u30b9\u983b\u5ea6\u306e\u76e3\u8996\n        $accessCount = Cache::increment(\"file_access_{$path}\");\n\n        \/\/ \u983b\u7e41\u306b\u30a2\u30af\u30bb\u30b9\u3055\u308c\u308b\u30d5\u30a1\u30a4\u30eb\u306f\u81ea\u52d5\u7684\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\n        if ($accessCount &gt; 100) {\n            return Cache::remember(\"file_content_{$path}\", 3600, function () use ($path) {\n                return Storage::get($path);\n            });\n        }\n\n        return Storage::get($path);\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u8aad\u307f\u66f8\u304d\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u76e3\u8996<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class StoragePerformanceMonitor\n{\n    public function monitor($operation, $path, callable $callback)\n    {\n        $startTime = microtime(true);\n\n        try {\n            $result = $callback();\n\n            \/\/ \u51e6\u7406\u6642\u9593\u306e\u8a18\u9332\n            $duration = microtime(true) - $startTime;\n            $this-&gt;logPerformance($operation, $path, $duration);\n\n            return $result;\n        } catch (\\Exception $e) {\n            $this-&gt;logError($operation, $path, $e);\n            throw $e;\n        }\n    }\n\n    private function logPerformance($operation, $path, $duration)\n    {\n        Log::info(\"Storage {$operation} completed\", [\n            'path' =&gt; $path,\n            'duration' =&gt; $duration,\n            'memory_usage' =&gt; memory_get_peak_usage(true)\n        ]);\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u9ad8\u901f\u306a\u30d5\u30a1\u30a4\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u5927\u898f\u6a21\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u5bfe\u7b56\u304c\u91cd\u8981\u306b\u306a\u3063\u3066\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">\u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u3068\u306e\u9023\u643a\u5b9f\u88c5<\/h2>\n\n\n\n<p>Laravel Storage\u3092\u4f7f\u7528\u3057\u305f\u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u3068\u306e\u9023\u643a\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u624b\u9806\u3068\u5b9f\u8df5\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">AWS S3\u3068\u306e\u9023\u643a\u8a2d\u5b9a\u3068\u4f7f\u3044\u65b9<\/h3>\n\n\n\n<p><strong>1. \u521d\u671f\u8a2d\u5b9a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5fc5\u8981\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncomposer require league\/flysystem-aws-s3-v3\n\n# .env \u30d5\u30a1\u30a4\u30eb\u306e\u8a2d\u5b9a\nAWS_ACCESS_KEY_ID=your-key\nAWS_SECRET_ACCESS_KEY=your-secret\nAWS_DEFAULT_REGION=ap-northeast-1\nAWS_BUCKET=your-bucket\nAWS_USE_PATH_STYLE_ENDPOINT=false<\/pre>\n\n\n\n<p><strong>2. \u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class S3StorageService\n{\n    public function uploadToS3($file, $path)\n    {\n        try {\n            \/\/ \u30d1\u30d6\u30ea\u30c3\u30af\u30a2\u30af\u30bb\u30b9\u53ef\u80fd\u306a\u30d5\u30a1\u30a4\u30eb\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\n            $result = Storage::disk('s3')-&gt;putFileAs(\n                'public\/uploads',\n                $file,\n                $path,\n                ['visibility' =&gt; 'public']\n            );\n\n            if ($result) {\n                return Storage::disk('s3')-&gt;url($path);\n            }\n\n            return null;\n        } catch (\\Exception $e) {\n            Log::error('S3 upload failed: ' . $e-&gt;getMessage());\n            throw $e;\n        }\n    }\n\n    public function getSignedUrl($path, $expiration = 5)\n    {\n        try {\n            \/\/ \u7f72\u540d\u4ed8\u304dURL\u751f\u6210\uff08\u671f\u9650\u4ed8\u304d\u30a2\u30af\u30bb\u30b9\uff09\n            return Storage::disk('s3')-&gt;temporaryUrl(\n                $path,\n                now()-&gt;addMinutes($expiration),\n                [\n                    'ResponseContentDisposition' =&gt; 'attachment'\n                ]\n            );\n        } catch (\\Exception $e) {\n            Log::error('Failed to generate signed URL: ' . $e-&gt;getMessage());\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<p><strong>3. S3\u30d0\u30b1\u30c3\u30c8\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a\u4f8b<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Sid\": \"PublicReadForGetBucketObjects\",\n            \"Effect\": \"Allow\",\n            \"Principal\": \"*\",\n            \"Action\": \"s3:GetObject\",\n            \"Resource\": \"arn:aws:s3:::your-bucket-name\/public\/*\"\n        }\n    ]\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">Google Cloud Storage\u306e\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>1. \u74b0\u5883\u8a2d\u5b9a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5fc5\u8981\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\ncomposer require google\/cloud-storage\n\n# .env \u30d5\u30a1\u30a4\u30eb\u306e\u8a2d\u5b9a\nGOOGLE_CLOUD_PROJECT_ID=your-project-id\nGOOGLE_CLOUD_STORAGE_BUCKET=your-bucket\nGOOGLE_CLOUD_CREDENTIALS=path\/to\/credentials.json<\/pre>\n\n\n\n<p><strong>2. \u30b5\u30fc\u30d3\u30b9\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u8a2d\u5b9a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace App\\Providers;\n\nuse Google\\Cloud\\Storage\\StorageClient;\nuse League\\Flysystem\\Filesystem;\nuse League\\Flysystem\\GoogleCloudStorage\\GoogleCloudStorageAdapter;\nuse Storage;\n\nclass GoogleCloudServiceProvider extends ServiceProvider\n{\n    public function boot()\n    {\n        Storage::extend('gcs', function ($app, $config) {\n            $storageClient = new StorageClient([\n                'projectId' =&gt; $config['project_id'],\n                'keyFilePath' =&gt; $config['credentials_path']\n            ]);\n\n            $bucket = $storageClient-&gt;bucket($config['bucket']);\n            $adapter = new GoogleCloudStorageAdapter($bucket);\n\n            return new Filesystem($adapter);\n        });\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u5b9f\u88c5\u4f8b<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class GCSStorageService\n{\n    public function uploadToGCS($file, $path)\n    {\n        try {\n            \/\/ \u30e1\u30bf\u30c7\u30fc\u30bf\u4ed8\u304d\u3067\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\n            return Storage::disk('gcs')-&gt;put(\n                $path,\n                file_get_contents($file),\n                [\n                    'metadata' =&gt; [\n                        'contentType' =&gt; $file-&gt;getMimeType(),\n                        'cacheControl' =&gt; 'public, max-age=86400'\n                    ]\n                ]\n            );\n        } catch (\\Exception $e) {\n            Log::error('GCS upload failed: ' . $e-&gt;getMessage());\n            throw $e;\n        }\n    }\n\n    public function getPublicUrl($path)\n    {\n        return Storage::disk('gcs')-&gt;url($path);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30de\u30eb\u30c1\u30af\u30e9\u30a6\u30c9\u74b0\u5883\u3067\u306e\u904b\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p><strong>1. \u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u62bd\u8c61\u5316\u30b5\u30fc\u30d3\u30b9<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class CloudStorageService\n{\n    private $defaultDisk;\n\n    public function __construct()\n    {\n        $this-&gt;defaultDisk = config('filesystems.default');\n    }\n\n    public function upload($file, $path, $disk = null)\n    {\n        $disk = $disk ?? $this-&gt;defaultDisk;\n\n        try {\n            $result = Storage::disk($disk)-&gt;putFileAs(\n                dirname($path),\n                $file,\n                basename($path)\n            );\n\n            return [\n                'success' =&gt; $result,\n                'path' =&gt; $path,\n                'disk' =&gt; $disk,\n                'url' =&gt; $this-&gt;getUrl($path, $disk)\n            ];\n        } catch (\\Exception $e) {\n            Log::error(\"Upload failed on disk {$disk}: \" . $e-&gt;getMessage());\n            throw $e;\n        }\n    }\n\n    public function getUrl($path, $disk = null)\n    {\n        $disk = $disk ?? $this-&gt;defaultDisk;\n\n        switch ($disk) {\n            case 's3':\n                return Storage::disk($disk)-&gt;temporaryUrl(\n                    $path,\n                    now()-&gt;addMinutes(5)\n                );\n            case 'gcs':\n                return Storage::disk($disk)-&gt;url($path);\n            default:\n                return Storage::disk($disk)-&gt;url($path);\n        }\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u30d5\u30a7\u30a4\u30eb\u30aa\u30fc\u30d0\u30fc\u6a5f\u80fd\u306e\u5b9f\u88c5<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class FailoverStorageService\n{\n    private $disks = ['s3', 'gcs', 'local'];\n\n    public function store($file, $path)\n    {\n        foreach ($this-&gt;disks as $disk) {\n            try {\n                $result = Storage::disk($disk)-&gt;putFileAs(\n                    dirname($path),\n                    $file,\n                    basename($path)\n                );\n\n                if ($result) {\n                    return [\n                        'success' =&gt; true,\n                        'disk' =&gt; $disk,\n                        'path' =&gt; $path\n                    ];\n                }\n            } catch (\\Exception $e) {\n                Log::warning(\"Storage failed on {$disk}: \" . $e-&gt;getMessage());\n                continue;\n            }\n        }\n\n        throw new \\Exception('All storage attempts failed');\n    }\n\n    public function retrieve($path)\n    {\n        foreach ($this-&gt;disks as $disk) {\n            try {\n                if (Storage::disk($disk)-&gt;exists($path)) {\n                    return Storage::disk($disk)-&gt;get($path);\n                }\n            } catch (\\Exception $e) {\n                continue;\n            }\n        }\n\n        throw new \\Exception('File not found in any storage');\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u5206\u6563\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u7ba1\u7406<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class DistributedStorageManager\n{\n    private $config = [\n        'images' =&gt; 's3',\n        'documents' =&gt; 'gcs',\n        'temp' =&gt; 'local'\n    ];\n\n    public function store($file, $type)\n    {\n        if (!isset($this-&gt;config[$type])) {\n            throw new \\InvalidArgumentException('Invalid file type');\n        }\n\n        $disk = $this-&gt;config[$type];\n        $path = $this-&gt;generatePath($file, $type);\n\n        return Storage::disk($disk)-&gt;putFileAs(\n            $type,\n            $file,\n            basename($path)\n        );\n    }\n\n    private function generatePath($file, $type)\n    {\n        $hash = md5(uniqid() . $file-&gt;getClientOriginalName());\n        return sprintf(\n            '%s\/%s\/%s.%s',\n            $type,\n            substr($hash, 0, 2),\n            $hash,\n            $file-&gt;getClientOriginalExtension()\n        );\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u8907\u6570\u306e\u30af\u30e9\u30a6\u30c9\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3057\u3001\u30d5\u30a7\u30a4\u30eb\u30aa\u30fc\u30d0\u30fc\u3084\u5206\u6563\u30b9\u30c8\u30ec\u30fc\u30b8\u306a\u3069\u306e\u9ad8\u5ea6\u306a\u6a5f\u80fd\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0<\/h2>\n\n\n\n<p>Laravel Storage\u3092\u904b\u7528\u3059\u308b\u4e2d\u3067\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u554f\u984c\u3068\u305d\u306e\u89e3\u6c7a\u65b9\u6cd5\u3001\u52b9\u679c\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u3088\u304f\u3042\u308b\u554f\u984c\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p><strong>1. \u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u95a2\u9023\u306e\u554f\u984c<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u554f\u984c: storage \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3078\u306e\u66f8\u304d\u8fbc\u307f\u6a29\u9650\u30a8\u30e9\u30fc\nPermission denied (publicPath: \/var\/www\/html\/storage\/app\/public)\n\n\/\/ \u89e3\u6c7a\u65b9\u6cd5\nclass StoragePermissionsFixer\n{\n    public function fix()\n    {\n        $paths = [\n            storage_path('app'),\n            storage_path('app\/public'),\n            public_path('storage')\n        ];\n\n        foreach ($paths as $path) {\n            \/\/ \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5b58\u5728\u78ba\u8a8d\n            if (!file_exists($path)) {\n                mkdir($path, 0755, true);\n            }\n\n            \/\/ \u6a29\u9650\u8a2d\u5b9a\n            chmod($path, 0755);\n            chown($path, 'www-data');\n        }\n\n        \/\/ \u30b7\u30f3\u30dc\u30ea\u30c3\u30af\u30ea\u30f3\u30af\u306e\u518d\u4f5c\u6210\n        if (file_exists(public_path('storage'))) {\n            unlink(public_path('storage'));\n        }\n\n        Artisan::call('storage:link');\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u30c7\u30a3\u30b9\u30af\u8a2d\u5b9a\u306e\u554f\u984c<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u554f\u984c: \u30c7\u30a3\u30b9\u30af\u306e\u8a2d\u5b9a\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u30a8\u30e9\u30fc\nclass DiskConfigurationChecker\n{\n    public function validateConfig()\n    {\n        $disks = config('filesystems.disks');\n        $errors = [];\n\n        foreach ($disks as $name =&gt; $config) {\n            if (!isset($config['driver'])) {\n                $errors[] = \"Disk {$name} is missing driver configuration\";\n            }\n\n            if ($config['driver'] === 's3') {\n                $required = ['key', 'secret', 'region', 'bucket'];\n                foreach ($required as $field) {\n                    if (empty($config[$field])) {\n                        $errors[] = \"S3 disk {$name} is missing {$field}\";\n                    }\n                }\n            }\n        }\n\n        return $errors;\n    }\n\n    public function fixCommonIssues()\n    {\n        \/\/ \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u30af\u30ea\u30a2\n        Artisan::call('config:clear');\n\n        \/\/ .env\u30d5\u30a1\u30a4\u30eb\u306e\u5b58\u5728\u78ba\u8a8d\n        if (!file_exists(base_path('.env'))) {\n            copy(base_path('.env.example'), base_path('.env'));\n            Artisan::call('key:generate');\n        }\n    }\n}<\/pre>\n\n\n\n<p><strong>3. \u30d5\u30a1\u30a4\u30eb\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306e\u554f\u984c<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class FileUploadDebugger\n{\n    public function debugUpload($file)\n    {\n        $issues = [];\n\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u306e\u78ba\u8a8d\n        if ($file-&gt;getSize() &gt; ini_get('upload_max_filesize')) {\n            $issues[] = 'File exceeds PHP upload_max_filesize';\n        }\n\n        \/\/ MIME\u30bf\u30a4\u30d7\u306e\u78ba\u8a8d\n        $mimeType = $file-&gt;getMimeType();\n        if (!in_array($mimeType, $this-&gt;getAllowedMimeTypes())) {\n            $issues[] = \"Invalid MIME type: {$mimeType}\";\n        }\n\n        \/\/ \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u5148\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u78ba\u8a8d\n        $uploadPath = storage_path('app\/uploads');\n        if (!is_writable($uploadPath)) {\n            $issues[] = \"Upload directory is not writable: {$uploadPath}\";\n        }\n\n        return $issues;\n    }\n\n    private function getAllowedMimeTypes()\n    {\n        return [\n            'image\/jpeg',\n            'image\/png',\n            'application\/pdf',\n            \/\/ \u305d\u306e\u4ed6\u8a31\u53ef\u3059\u308bMIME\u30bf\u30a4\u30d7\n        ];\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u52b9\u679c\u7684\u306a\u30ed\u30b0\u8a2d\u5b9a\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/h3>\n\n\n\n<p><strong>1. \u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/logging.php\n'channels' =&gt; [\n    'storage' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/storage.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n],\n\n\/\/ \u4f7f\u7528\u4f8b\nclass StorageLogger\n{\n    private $logger;\n\n    public function __construct()\n    {\n        $this-&gt;logger = Log::channel('storage');\n    }\n\n    public function logOperation($operation, $path, $result)\n    {\n        $context = [\n            'operation' =&gt; $operation,\n            'path' =&gt; $path,\n            'disk' =&gt; config('filesystems.default'),\n            'user_id' =&gt; auth()-&gt;id(),\n            'ip' =&gt; request()-&gt;ip(),\n            'result' =&gt; $result\n        ];\n\n        $this-&gt;logger-&gt;info('Storage operation completed', $context);\n    }\n\n    public function logError($operation, \\Exception $e)\n    {\n        $this-&gt;logger-&gt;error('Storage operation failed', [\n            'operation' =&gt; $operation,\n            'error' =&gt; $e-&gt;getMessage(),\n            'trace' =&gt; $e-&gt;getTraceAsString()\n        ]);\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class StorageMonitor\n{\n    public function recordMetrics($operation, callable $callback)\n    {\n        $startTime = microtime(true);\n        $startMemory = memory_get_usage();\n\n        try {\n            $result = $callback();\n\n            $this-&gt;saveMetrics([\n                'operation' =&gt; $operation,\n                'duration' =&gt; microtime(true) - $startTime,\n                'memory_used' =&gt; memory_get_usage() - $startMemory,\n                'status' =&gt; 'success'\n            ]);\n\n            return $result;\n        } catch (\\Exception $e) {\n            $this-&gt;saveMetrics([\n                'operation' =&gt; $operation,\n                'duration' =&gt; microtime(true) - $startTime,\n                'memory_used' =&gt; memory_get_usage() - $startMemory,\n                'status' =&gt; 'error',\n                'error' =&gt; $e-&gt;getMessage()\n            ]);\n\n            throw $e;\n        }\n    }\n\n    private function saveMetrics($metrics)\n    {\n        StorageMetric::create($metrics);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u672c\u756a\u74b0\u5883\u3067\u306e\u6ce8\u610f\u70b9\u3068\u5bfe\u7b56<\/h3>\n\n\n\n<p><strong>1. \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProductionStorageService\n{\n    public function safeOperation(callable $operation)\n    {\n        try {\n            return $operation();\n        } catch (\\League\\Flysystem\\FileNotFoundException $e) {\n            Log::error('File not found', [\n                'message' =&gt; $e-&gt;getMessage(),\n                'path' =&gt; $e-&gt;getPath()\n            ]);\n            throw new FileNotFoundException($e-&gt;getMessage());\n        } catch (\\League\\Flysystem\\UnreadableFileException $e) {\n            Log::error('File unreadable', [\n                'message' =&gt; $e-&gt;getMessage()\n            ]);\n            throw new StorageException('Unable to read file');\n        } catch (\\Exception $e) {\n            Log::error('Unexpected storage error', [\n                'message' =&gt; $e-&gt;getMessage(),\n                'trace' =&gt; $e-&gt;getTraceAsString()\n            ]);\n            throw new StorageException('Storage operation failed');\n        }\n    }\n}<\/pre>\n\n\n\n<p><strong>2. \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3068\u5fa9\u65e7\u624b\u9806<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class StorageBackupService\n{\n    public function createBackup($disk = null)\n    {\n        $disk = $disk ?? config('filesystems.default');\n        $backupPath = 'backups\/' . date('Y-m-d_H-i-s');\n\n        \/\/ \u91cd\u8981\u306a\u30d5\u30a1\u30a4\u30eb\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\n        $files = Storage::disk($disk)-&gt;allFiles('public');\n        foreach ($files as $file) {\n            try {\n                $content = Storage::disk($disk)-&gt;get($file);\n                Storage::disk('backup')-&gt;put(\n                    $backupPath . '\/' . $file,\n                    $content\n                );\n            } catch (\\Exception $e) {\n                Log::error(\"Backup failed for file: {$file}\");\n                continue;\n            }\n        }\n\n        \/\/ \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u4fdd\u5b58\n        $this-&gt;saveBackupMetadata($backupPath, $files);\n    }\n\n    private function saveBackupMetadata($backupPath, $files)\n    {\n        $metadata = [\n            'timestamp' =&gt; now(),\n            'file_count' =&gt; count($files),\n            'source_disk' =&gt; config('filesystems.default'),\n            'backup_path' =&gt; $backupPath\n        ];\n\n        Storage::disk('backup')-&gt;put(\n            $backupPath . '\/metadata.json',\n            json_encode($metadata, JSON_PRETTY_PRINT)\n        );\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u76e3\u8996\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001Laravel Storage\u3092\u672c\u756a\u74b0\u5883\u3067\u5b89\u5b9a\u3057\u3066\u904b\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001\u554f\u984c\u304c\u767a\u751f\u3057\u305f\u969b\u306e\u65e9\u671f\u767a\u898b\u3068\u8fc5\u901f\u306a\u5bfe\u5fdc\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,12],"tags":[],"class_list":{"0":"post-3211","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php-laravel","7":"category-php","8":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3211"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3211\/revisions"}],"predecessor-version":[{"id":3213,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/3211\/revisions\/3213"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}