Submit Search
Upload
WordPressでログイン必須のコンテンツを作ったときに気付いたこと
•
Download as PPTX, PDF
•
0 likes
•
2,442 views
雄
雄一郎 安倍
Follow
各コンテンツの保護利用時の注意点と ログインしないと見れない画像の実現方法のサンプル等
Read less
Read more
Internet
Report
Share
Report
Share
1 of 18
Download now
Recommended
CSS com SASS e SMACSS faz BEM
CSS com SASS e SMACSS faz BEM
Wellington Dutra
플리토 회사소개서
플리토 회사소개서
우영 강
ADFSの証明書入れ替えではまった話
ADFSの証明書入れ替えではまった話
Genki WATANABE
픽사메이커스 브랜드 소개서 2022(저용량)
픽사메이커스 브랜드 소개서 2022(저용량)
메이커스 픽사
픽사메이커스 Artful(컬쳐덱)
픽사메이커스 Artful(컬쳐덱)
메이커스 픽사
A bicikli
A bicikli
szoradineeva
BizSecDevOps is Scrum Period.
BizSecDevOps is Scrum Period.
Chris Lukassen
더부스브루잉(The Booth Brewing) 브랜드북_숙명여자대학교 홍보광고학과 소수현
더부스브루잉(The Booth Brewing) 브랜드북_숙명여자대학교 홍보광고학과 소수현
SUHYEONSoh
Recommended
CSS com SASS e SMACSS faz BEM
CSS com SASS e SMACSS faz BEM
Wellington Dutra
플리토 회사소개서
플리토 회사소개서
우영 강
ADFSの証明書入れ替えではまった話
ADFSの証明書入れ替えではまった話
Genki WATANABE
픽사메이커스 브랜드 소개서 2022(저용량)
픽사메이커스 브랜드 소개서 2022(저용량)
메이커스 픽사
픽사메이커스 Artful(컬쳐덱)
픽사메이커스 Artful(컬쳐덱)
메이커스 픽사
A bicikli
A bicikli
szoradineeva
BizSecDevOps is Scrum Period.
BizSecDevOps is Scrum Period.
Chris Lukassen
더부스브루잉(The Booth Brewing) 브랜드북_숙명여자대학교 홍보광고학과 소수현
더부스브루잉(The Booth Brewing) 브랜드북_숙명여자대학교 홍보광고학과 소수현
SUHYEONSoh
Esto si es un tatoo
Esto si es un tatoo
Jack Eitor
La recente evoluzione della regolazione del servizio idrico integrato
La recente evoluzione della regolazione del servizio idrico integrato
ARERA
일관된 경험을 주는 브랜드 만들기.pdf
일관된 경험을 주는 브랜드 만들기.pdf
Tac Min Oh
Valmet Acoustic Pyrometer AP 106 Manual 191022-1.pdf
Valmet Acoustic Pyrometer AP 106 Manual 191022-1.pdf
ssuser3d8ccb
[창업자&예비창업자] 투자자를 사로잡는 IR
[창업자&예비창업자] 투자자를 사로잡는 IR
더게임체인저스
2022 한양대_내셔널브랜드_MyWave_타이거민즈_최종발표.pdf
2022 한양대_내셔널브랜드_MyWave_타이거민즈_최종발표.pdf
Artcoon
Non Linear Models Driving The Next Phase Of Growth For The Indian It Industry
Non Linear Models Driving The Next Phase Of Growth For The Indian It Industry
AljoJohnson
工数見積りのぶれ幅を理解してチームの見積り精度を上げた話
工数見積りのぶれ幅を理解してチームの見積り精度を上げた話
chome maru3
Basico bearing Catalogue
Basico bearing Catalogue
Myra Peng
Sec016 詳説 -_rights_management_services__azure_information_protection
Sec016 詳説 -_rights_management_services__azure_information_protection
Tech Summit 2016
e-mart No Brand
e-mart No Brand
수연 김
ESTUDO DE MÉTODOS DE IDENTIFICAÇÃO DE SISTEMAS EM MALHA FECHADA APLICADOS A P...
ESTUDO DE MÉTODOS DE IDENTIFICAÇÃO DE SISTEMAS EM MALHA FECHADA APLICADOS A P...
Patrick Pires Alvim
2021 한양대_내셔널브랜드_Vida_C4D_최종제출.pdf
2021 한양대_내셔널브랜드_Vida_C4D_최종제출.pdf
Artcoon
Static Web AppsとBlazor WebAssemblyのすすめ
Static Web AppsとBlazor WebAssemblyのすすめ
TomomitsuKusaba
CNC T-BAR 형상제어 시스템을 활용한 비정형 건축물의 곡면파사드의 시공사례 검토
CNC T-BAR 형상제어 시스템을 활용한 비정형 건축물의 곡면파사드의 시공사례 검토
성진 김
2018-2 브랜드커뮤니케이션 전략 29CM 브랜드북
2018-2 브랜드커뮤니케이션 전략 29CM 브랜드북
EunchaeKim1
2022 한양대_내셔널브랜드_AIRNECT_두잇_최종발표.pdf
2022 한양대_내셔널브랜드_AIRNECT_두잇_최종발표.pdf
Artcoon
Catalogo acessórios para rolamentos
Catalogo acessórios para rolamentos
Anderson Monari
2012 Mazda Mazda2 Hatchback owners manual provided by naples mazda
2012 Mazda Mazda2 Hatchback owners manual provided by naples mazda
Naples Mazda
Einleitung - zum Lehrbuch und dem etwas anderen Lehrbuchprojekt
Einleitung - zum Lehrbuch und dem etwas anderen Lehrbuchprojekt
L3T - Lehrbuch für Lehren und Lernen mit Technologie
Launch a Web Service in 3 Days Using WordPress
Launch a Web Service in 3 Days Using WordPress
Kite Koga
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
Hiroshi Tokumaru
More Related Content
What's hot
Esto si es un tatoo
Esto si es un tatoo
Jack Eitor
La recente evoluzione della regolazione del servizio idrico integrato
La recente evoluzione della regolazione del servizio idrico integrato
ARERA
일관된 경험을 주는 브랜드 만들기.pdf
일관된 경험을 주는 브랜드 만들기.pdf
Tac Min Oh
Valmet Acoustic Pyrometer AP 106 Manual 191022-1.pdf
Valmet Acoustic Pyrometer AP 106 Manual 191022-1.pdf
ssuser3d8ccb
[창업자&예비창업자] 투자자를 사로잡는 IR
[창업자&예비창업자] 투자자를 사로잡는 IR
더게임체인저스
2022 한양대_내셔널브랜드_MyWave_타이거민즈_최종발표.pdf
2022 한양대_내셔널브랜드_MyWave_타이거민즈_최종발표.pdf
Artcoon
Non Linear Models Driving The Next Phase Of Growth For The Indian It Industry
Non Linear Models Driving The Next Phase Of Growth For The Indian It Industry
AljoJohnson
工数見積りのぶれ幅を理解してチームの見積り精度を上げた話
工数見積りのぶれ幅を理解してチームの見積り精度を上げた話
chome maru3
Basico bearing Catalogue
Basico bearing Catalogue
Myra Peng
Sec016 詳説 -_rights_management_services__azure_information_protection
Sec016 詳説 -_rights_management_services__azure_information_protection
Tech Summit 2016
e-mart No Brand
e-mart No Brand
수연 김
ESTUDO DE MÉTODOS DE IDENTIFICAÇÃO DE SISTEMAS EM MALHA FECHADA APLICADOS A P...
ESTUDO DE MÉTODOS DE IDENTIFICAÇÃO DE SISTEMAS EM MALHA FECHADA APLICADOS A P...
Patrick Pires Alvim
2021 한양대_내셔널브랜드_Vida_C4D_최종제출.pdf
2021 한양대_내셔널브랜드_Vida_C4D_최종제출.pdf
Artcoon
Static Web AppsとBlazor WebAssemblyのすすめ
Static Web AppsとBlazor WebAssemblyのすすめ
TomomitsuKusaba
CNC T-BAR 형상제어 시스템을 활용한 비정형 건축물의 곡면파사드의 시공사례 검토
CNC T-BAR 형상제어 시스템을 활용한 비정형 건축물의 곡면파사드의 시공사례 검토
성진 김
2018-2 브랜드커뮤니케이션 전략 29CM 브랜드북
2018-2 브랜드커뮤니케이션 전략 29CM 브랜드북
EunchaeKim1
2022 한양대_내셔널브랜드_AIRNECT_두잇_최종발표.pdf
2022 한양대_내셔널브랜드_AIRNECT_두잇_최종발표.pdf
Artcoon
Catalogo acessórios para rolamentos
Catalogo acessórios para rolamentos
Anderson Monari
2012 Mazda Mazda2 Hatchback owners manual provided by naples mazda
2012 Mazda Mazda2 Hatchback owners manual provided by naples mazda
Naples Mazda
Einleitung - zum Lehrbuch und dem etwas anderen Lehrbuchprojekt
Einleitung - zum Lehrbuch und dem etwas anderen Lehrbuchprojekt
L3T - Lehrbuch für Lehren und Lernen mit Technologie
What's hot
(20)
Esto si es un tatoo
Esto si es un tatoo
La recente evoluzione della regolazione del servizio idrico integrato
La recente evoluzione della regolazione del servizio idrico integrato
일관된 경험을 주는 브랜드 만들기.pdf
일관된 경험을 주는 브랜드 만들기.pdf
Valmet Acoustic Pyrometer AP 106 Manual 191022-1.pdf
Valmet Acoustic Pyrometer AP 106 Manual 191022-1.pdf
[창업자&예비창업자] 투자자를 사로잡는 IR
[창업자&예비창업자] 투자자를 사로잡는 IR
2022 한양대_내셔널브랜드_MyWave_타이거민즈_최종발표.pdf
2022 한양대_내셔널브랜드_MyWave_타이거민즈_최종발표.pdf
Non Linear Models Driving The Next Phase Of Growth For The Indian It Industry
Non Linear Models Driving The Next Phase Of Growth For The Indian It Industry
工数見積りのぶれ幅を理解してチームの見積り精度を上げた話
工数見積りのぶれ幅を理解してチームの見積り精度を上げた話
Basico bearing Catalogue
Basico bearing Catalogue
Sec016 詳説 -_rights_management_services__azure_information_protection
Sec016 詳説 -_rights_management_services__azure_information_protection
e-mart No Brand
e-mart No Brand
ESTUDO DE MÉTODOS DE IDENTIFICAÇÃO DE SISTEMAS EM MALHA FECHADA APLICADOS A P...
ESTUDO DE MÉTODOS DE IDENTIFICAÇÃO DE SISTEMAS EM MALHA FECHADA APLICADOS A P...
2021 한양대_내셔널브랜드_Vida_C4D_최종제출.pdf
2021 한양대_내셔널브랜드_Vida_C4D_최종제출.pdf
Static Web AppsとBlazor WebAssemblyのすすめ
Static Web AppsとBlazor WebAssemblyのすすめ
CNC T-BAR 형상제어 시스템을 활용한 비정형 건축물의 곡면파사드의 시공사례 검토
CNC T-BAR 형상제어 시스템을 활용한 비정형 건축물의 곡면파사드의 시공사례 검토
2018-2 브랜드커뮤니케이션 전략 29CM 브랜드북
2018-2 브랜드커뮤니케이션 전략 29CM 브랜드북
2022 한양대_내셔널브랜드_AIRNECT_두잇_최종발표.pdf
2022 한양대_내셔널브랜드_AIRNECT_두잇_최종발표.pdf
Catalogo acessórios para rolamentos
Catalogo acessórios para rolamentos
2012 Mazda Mazda2 Hatchback owners manual provided by naples mazda
2012 Mazda Mazda2 Hatchback owners manual provided by naples mazda
Einleitung - zum Lehrbuch und dem etwas anderen Lehrbuchprojekt
Einleitung - zum Lehrbuch und dem etwas anderen Lehrbuchprojekt
Similar to WordPressでログイン必須のコンテンツを作ったときに気付いたこと
Launch a Web Service in 3 Days Using WordPress
Launch a Web Service in 3 Days Using WordPress
Kite Koga
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
Hiroshi Tokumaru
再構築ハンズオン
再構築ハンズオン
Yoshitaka KATO
WordBech Osaka No.28
WordBech Osaka No.28
Kite Koga
小さな開発会社でもできた、WordPress 新ビジネスの可能性 -WordCamp Kansai 2024-
小さな開発会社でもできた、WordPress 新ビジネスの可能性 -WordCamp Kansai 2024-
KojiMaruyama5
WordPressプラグイン作成入門
WordPressプラグイン作成入門
Yuji Nojima
Word press 3.5RC2 - パーフェクト functions.php -
Word press 3.5RC2 - パーフェクト functions.php -
BREN
WordPressとリスク管理 at 第42回 WordBench大阪
WordPressとリスク管理 at 第42回 WordBench大阪
Kitani Kimiya
Windows storeアプリ brekky
Windows storeアプリ brekky
Satoshi Sekine
MailFluteでメール送信を楽しもう!
MailFluteでメール送信を楽しもう!
p1us2er0
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
Yuji Takayama
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
Yuji Takayama
Using Dancer
Using Dancer
Yoshihiro Sasaki
iOS WebView App
iOS WebView App
hagino 3000
WordPress widget api
WordPress widget api
Takami Kazuya
Azure Policyでハイブリッドな構成管理
Azure Policyでハイブリッドな構成管理
Masahiko Ebisuda
ブログメディアにおけるData APIの活用について
ブログメディアにおけるData APIの活用について
Hatsuhito UENO
Ci tutorial
Ci tutorial
Kazuaki Ueda
勉強会force#2 HTML5によるモバイルアプリ開発
勉強会force#2 HTML5によるモバイルアプリ開発
Kazuki Nakajima
Similar to WordPressでログイン必須のコンテンツを作ったときに気付いたこと
(20)
Launch a Web Service in 3 Days Using WordPress
Launch a Web Service in 3 Days Using WordPress
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
デバッガでWordPress本体やプラグインの脆弱性を追いかけてみよう
再構築ハンズオン
再構築ハンズオン
WordBech Osaka No.28
WordBech Osaka No.28
小さな開発会社でもできた、WordPress 新ビジネスの可能性 -WordCamp Kansai 2024-
小さな開発会社でもできた、WordPress 新ビジネスの可能性 -WordCamp Kansai 2024-
WordPressプラグイン作成入門
WordPressプラグイン作成入門
Word press 3.5RC2 - パーフェクト functions.php -
Word press 3.5RC2 - パーフェクト functions.php -
WordPressとリスク管理 at 第42回 WordBench大阪
WordPressとリスク管理 at 第42回 WordBench大阪
Windows storeアプリ brekky
Windows storeアプリ brekky
MailFluteでメール送信を楽しもう!
MailFluteでメール送信を楽しもう!
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
Using Dancer
Using Dancer
iOS WebView App
iOS WebView App
WordPress widget api
WordPress widget api
Azure Policyでハイブリッドな構成管理
Azure Policyでハイブリッドな構成管理
ブログメディアにおけるData APIの活用について
ブログメディアにおけるData APIの活用について
Ci tutorial
Ci tutorial
勉強会force#2 HTML5によるモバイルアプリ開発
勉強会force#2 HTML5によるモバイルアプリ開発
WordPressでログイン必須のコンテンツを作ったときに気付いたこと
1.
WordPressでログイン必須のコンテ ンツを作ったときの気付いたこと アイティーエー株式会社 ゆいち
2.
自己紹介 ・Contact Form 7
add confirmって言う、Contact Form 7に確認画面を 作るプラグイン公開してます。 ・WordPressを使って、顧客管理とか販売管理とか ポータルシステムとか作ることが多いです。 ・その保守のためにちょっと変わったレンタルサーバーしてます。 アイティーエー株式会社 ハンドル名は「ゆいち」で時々活動してます。 WordPressを利用したお仕事でいつもWordPressに お世話になりまくってます! 他にもプラ グインちょい 上げてます 良かったら声をかけて下さい。
3.
WordPressにはいくつかのログイン必須の コンテンツを提供する方法が用意されてい ますよね
4.
投稿にパスワード設定 非公開(ログインしないと見れない)
後、頑張って自力で実装
5.
とても手軽に使えて便利。
6.
でも 要望によっては対応しきれない、 困ったことがありました。
7.
投稿にパスワード設定の場合 パスワード保護されるのは、the_content()の部分だけ、 カスタムフィールドなどを駆使してテーマを作っていると、 その部分は見えてしまう。 <div><?php the_content();?></div> <ul> <?php
$hogehoge = get_post_meta($post_id, ’hogehoge’); ?> <li>フィールド1:<?php echo $hogehoge;?> </ul> ここは隠せるけど ここは隠せない → → 隠したい場合は「非公開」を使うか、 → 自力でごりごりしないとだめ →
8.
非公開(ログインしないと見れない) add_action( ‘wp’, ‘mysite_wp’
); function mysite_wp() { if ( 隠したいページだったら ) { if ( ! is_user_logged_in() ) { // ログイン画面へ wp_safe_redirect( home_url( ‘wp- login.php?redirect_to=‘ . urlencode(ページURL) ) ); } } } 例えばこんな感じ ログインせずにアクセスすると404エラーになる(そりゃ そうだ!)ので、自力でログイン画面へ遷移させたい。
9.
どちらの場合でもメディアは隠れない どちらの機能を使っても、ページに添付されたメディア は直リンクなので隠せない。 → → 隠したい場合は →
自力でごりごりしないとだめ → http://example.com/wp-content/uploads/2017/04/post1.jpg とか直接アクセスすると見えてしまう。
10.
管理画面を隠す際の注意点 管理画面を権限によって、隠すのに私はadmin_initフックをよ く使うのですが、すべてをredirectしてしまうとajaxが動作しな いプラグインが出てしまうことがあります。 → → これだとajaxが動作しないことがるので → add_action(
'admin_init', 'mysite_admin_init' ); function mysite_admin_init() { if ( ! current_user_can( 'administrator' ) ) { wp_safe_redirect( home_url( '/' ) ); die; } } function mysite_admin_init() { if ( ! current_user_can( 'administrator' ) ) { // admin-ajaxは除く if ( ( defined( 'DOING_AJAX' ) && ( ! DOING_AJAX ) ) || ( ! defined( 'DOING_AJAX' ) ) ) { wp_safe_redirect( home_url( '/' ) ); die; } } } ajaxを除外
11.
ざっと整理 パスワード保護で保護されるのはthe_contentの中身だけ 非公開の投稿はアクセスするとログインせずにアクセスすると 404エラーになる(当たり前と言えば当たり前
どちらの方法も、メディアファイルは保護されない。 管理画面を隠す際はajaxの動作(admin-ajax.php)を考慮す る必要がある。
12.
時間があれば画像のログイン必須の実現をさらっと 例えば、secureposts投稿タイプの投稿画面からのアップ ロードの場合、ログイン必須の画像として扱うようにする
13.
例えばこんな感じ <IfModule mod_rewrite.c> RewriteEngine On RewriteRule
^index.php$ - [L] RewriteRule (.*) /wp-admin/admin-ajax.php?action=mysite_secure&path=$1 </IfModule> /wp-content/uploads/secureフォルダを作成して、 .htaccessファイルを設置、このフォルダのアクセスをAPIへ location /wp-content/uploads/secure { return 301 /wp-admin/admin-ajax.php?action=mysite_secure&path=$uri; } nginxなら 本当はREST APIで作り直したいけど、時間が無かったので、とりあえず admin-ajaxでファイルへのアクセス
14.
/** 制御対象だった場合、アップロード先をsecureフォルダに変更 **/ add_filter(
'upload_dir', 'mysite_upload_dir' ); function mysite_upload_dir( $uploads ) { if ( isset( $_REQUEST['action'] ) && 'upload-attachment' == $_REQUEST['action'] ) { // ファイルのアップロード $is_secure = false; if ( isset( $_REQUEST[‘post_id’] ) && ( ‘’ != $_REQUEST[‘post_id’] ) ) { $post = get_post( intval( $_REQUEST[‘post_id’] ) ); if ( ‘secureposts’ == $post->post_type ) { $is_secure = true; } } elseif ( isset( $_REQUEST[‘post’] ) && ( ‘’ != $_REQUEST[‘post’] ) ) { // 投稿編集画面 $post = get_post( intval( $_REQUEST[‘post’] ) ); if ( ‘secureposts’ == $post->post_type ) { $is_secure = true; } } elseif ( isset( $_REQUEST[‘post_type’] ) && ( ‘secureposts’ == $_REQUEST[‘post_type’] ) ) { // 新規投稿画面 $is_secure = true; } // 紐付く投稿あり if ( $is_secure ) { $uploads['subdir'] = '/secure' . $uploads['subdir']; $uploads['path'] = $uploads['basedir'] . $uploads['subdir']; $uploads['url'] = $uploads['baseurl'] . $uploads['subdir']; if ( ! file_exists( $uploads['path'] ) ) { mkdir( $uploads['path'], 0777, true ); } } } return $uploads; } 対 象 の 投 稿 タ イ プ の 編 集 画 面 か を 判 別 パ ス を 変 更
15.
/** メディア上ではどれがセキュアな画像かわからないのでタイトルに[secure]を自動追加 **/ add_filter(
'mysite_secure_file_prefix', 'mysite_secure_file_prefix', 10 , 1); function mysite_secure_file_prefix($prefix) { return '[secure]'; } add_filter( 'wp_insert_attachment_data', 'mysite_wp_insert_attachment_data', 10, 2 ); function mysite_wp_insert_attachment_data( $data, $postarr ) { if ( isset( $_REQUEST['action'] ) && 'upload-attachment' == $_REQUEST['action'] ) { $is_secure = false; if ( isset( $_REQUEST['post_id'] ) && ( '' != $_REQUEST['post_id'] ) ) { $post = get_post( intval( $_REQUEST['post_id'] ) ); if ( 'secureposts' == $post->post_type ) { $is_secure = true; } } elseif ( isset( $_REQUEST['post'] ) && ( '' != $_REQUEST['post'] ) ) { $post = get_post( intval( $_REQUEST['post'] ) ); if ( 'secureposts' == $post->post_type ) { $is_secure = true; } } elseif ( isset( $_REQUEST['post_type'] ) && ( 'secureposts' == $_REQUEST['post_type'] ) ) { $is_secure = true; } if ( $is_secure ) { $data['post_title'] = apply_filters( 'mysite_secure_file_prefix', '' ) . $data['post_title']; } } return $data; } 対 象 の 投 稿 タ イ プ の 編 集 画 面 か を 判 別タイトルを変更
16.
/** 本当はREST APIで作り直したいけど、時間が無かったので、とりあえずadmin-ajaxでファイルへのアク セス
**/ add_action( ‘wp_ajax_mysite_secure’, ‘mysite_secure’ ); add_action( ‘wp_ajax_nopriv_mysite_secure’, ‘mysite_secure’ ); function mysite_secure() { if ( is_user_logged_in() === false ) { wp_die( ‘アクセス権がありません。' ); } $path = ABSPATH . $_REQUEST['path']; $filename = basename( $path ); // ファイル名から投稿を抽出 $file_meta_value = substr( $_REQUEST['path'], strpos( $_REQUEST['path'], '/secure/' ) + 1 ); $att_posts = new WP_Query( array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $file_meta_value ) ) ) ); if ( $att_posts->have_posts() ) { $att_posts->the_post(); $array_meta_data = get_post_meta( get_the_ID(), '_wp_attachment_metadata', true ); $ext = pathinfo( get_attached_file( get_the_ID() ), PATHINFO_EXTENSION ); $filename = substr( get_the_title(), strlen( apply_filters( 'mysite_secure_file_prefix', '' ) ) ) . '.' . $ext; if ( file_exists( $path ) ) { $filetype = wp_check_filetype( $filename ); header( "Content-Type: " . $filetype['type'] ); //$d = new DateTime('now', new DateTimeZone("Asia/Tokyo")); header( 'Content-Disposition: attachment; filename*=UTF-8''' . rawurlencode( $filename ) ); header( "Content-Length: " . filesize( $path ) ); ob_end_clean(); readfile( $path ); } } exit; } 元 の フ ァ イ ル 名 を 取 得 ダウンロード ログインチェック
17.
ちなみに文中のネコはうちの子です。
18.
おしまい
Download now