質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

Q&A

解決済

1回答

1111閲覧

ftp_getを使ってSQLiteのファイルをローカルにダウンロードできるようにしたい。

atld

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

0グッド

0クリップ

投稿2021/05/24 15:08

編集2021/05/25 03:00

前提・実現したいこと

ftp_getを使ってSQLiteのファイルをローカルにダウンロードできるようにしたいので、ご教示ください。

SQLiteのファイルは、phpのスクリプトによりサーバーのパスコードを使ってアップロードしており、ファイル名称は$_POSTで取得します。また、ローカルファイルパスは、使用しているアプリ(PhpStorm)に記載しているディレクトリーのパスを適用しています。

発生している問題・エラーメッセージ

ローカルファイルパスに対して、No such file or directoryのエラーメッセージが表示されます。問題がローカルパス自体にあるのか、それともローカルのコンピュータ側のセキュリティーなどに関連しているのか不明です。

エラーメッセージ

Warning:

1 2Warning: ftp_get(): Error opening /Users/**************/abcd.db in /usr/**************/down.php on line 57 3失敗しました 4### 該当のソースコード 5if (ftp_get($conn, $local_file, $server_file,FTP_BINARY)) 6```PHP 7ソースコード 8``` $conn = ftp_ssl_connect($ftp_host); 9 $login = ftp_login($conn, $ftp_user_name, $ftp_user_pass); 10 $mode = ftp_pasv($conn, TRUE); 11 12 13if ($_POST['name']) { // name = abcd.db 14 15 $name = $_POST["name"]; 16 17 $local_file_path = ‘/Users/***************/’; 18 $server_file_path= ‘/usr/**************/‘; 19 20 $server_file = $server_file_path . $name ; 21 $local_file = $local_file_path . $name ; 22 23 if (ftp_get($conn, $local_file, $server_file,FTP_BINARY)) { 24 echo "保存しました。: $local_file\n"; 25 } else { 26 echo "失敗しました。\n"; 27 } 28} 29ftp_close($conn); 30 31 32### 試したこと 33・パッシブモードでログインに成功しています。 34・ローカルファイルパスは、使用しているアプリ(PhpStorm)に記載しているディレクトリーのパスを適用しています。 35・パスやファイル名は、var_dump($server_file)、var_dump($local_file)、var_dump($name)などで表示して確認しています。 36 37### 補足情報(FW/ツールのバージョンなど) 38 使用環境 39 Mac OS10.13.6 php 7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zembutsu

2021/05/24 19:28

「PHP」のタグを付けて質問されると、PHPに詳しい方からアドバイスいただけるかもしれませんね。 接続できない時は、PHP側でエラーを取得するようにされたり、あるいはサーバ側の FTP ログを参照されると何か原因が分かるかもしれません。ログインが正常であれば、一般的な原因として、パーミッションだったり、ファイルを読み込む権限が無いことや、ディレクトリの移動制限(chroot設定)による影響が考えられます。
atld

2021/05/25 00:15

早速ありがとうございます。初心者で初質問なので、できるのかどうかもわかりませんが、「PHP」タグをつける方法、PHP側でのエラーの取得、サーバ側での FTP ログを調べてみます。わかり次第追記・編集いたします。
atld

2021/05/25 03:03

zembutsuさんのアドバイスにありました「PHP」タグを追加しました。
atld

2021/05/25 13:24

ログインが正常ですので、PHP側でのエラーの取得、サーバ側での FTP ログは省略し、zembutsuさんのアドバイスにありました「パーミッション」と「ディレクトリの移動制限」を調べてみました。結論は、パーミッションを777に設定しても同じエラーが出ます。また、「ディレクトリの移動制限」については、ネット上で「chrootを用いてSSHユーザのディレクトリを制限する」を参照した限り、内容は十分理解できていませんが、この制限はかかっていいないように思いました。
guest

回答1

0

自己解決

ftp_getに関する問題は、ネットで散々調べてみました。Why GitHub? やStack overflowにも同様の質問が出ていましたが、回答が見つかりませんでした。
そこで、別の方法を探したところ、Headerを使う方法で目的を達成できました。そのほかの手段として、HTML5のdownload属性を使う方法もあるようです。
お世話になりました皆様にお礼申し上げ、この質問を閉じさせていただきます。

尚、下記はパスワードを使ってログインするエリア内で、サーバーにログインして動かしているスクリプトですが、環境によっては問題が起こるかもしれません。それに対しては、最後尾の註)などを参照してください。

別の解決方法
//サーバーログイン
$ftp_host = “ ”;
$ftp_user_name = ' ';
$ftp_user_pass = ' ';

//Connect ホスト名、ユーザー名とパスワードでログインする
echo "<br />接続中 ー $ftp_host via FTP...";

$conn = ftp_ssl_connect($ftp_host); $login = ftp_login($conn, $ftp_user_name, $ftp_user_pass);

//パッシブモードをオンにする
$mode = ftp_pasv($conn, TRUE);

//Login OK ?
if ((!$conn) || (!$login) || (!$mode)) {
die("FTP 接続に失敗しました。 !");
}
echo " ログインに成功 ";

//ダウンロードロードパート name = abcd
if ($_POST['name']) {
$path = '/usr/*****/';
$name = $_POST["name"];

$filepath = $path . $name . '.db'; $filename = $name . '.db'; mb_output_handler("pass"); header('Content-Type: application/octet-stream'); header('Content-Length: ' . filesize($filepath)); header('Content-Disposition: attachment; filename="' . $filename . '"'); ob_end_clean(); readfile($filepath, FILE_BINARY); exit; }

ftp_close($conn);

註) mb_output_handler("pass"); および、 ob_end_clean(); については、
下記のサイトを参照ください。

PHP経由でダウンロードしたファイルが壊れてしまう
https://atyks.hateblo.jp/entry/2016/10/19/063948

PHPでファイルをダウンロードさせる時のエラーの対処
http://webdesign-dackel.com/2013/07/06/php-download-error/

【PHP】正しいダウンロード処理の書き方
https://qiita.com/fallout/items/3682e529d189693109eb

以上

投稿2021/05/30 10:07

atld

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問