- 締切済み
ファイルのダウンロードプログラム
PHPとSmartyを使ってアップロードしたwordファイルを、ダウンロードするプログラムを作成していますが、ファイル開く際に 「ファイルを開こうとして、エラーが発生しました。」 というダイアログが表示されます。 テキストで開くと、内容が文字化けしていますが、確認できるので、 エンコードの問題だと考え、エンコードの文を追記すると、ファイルは開けるのですが、 「A」 としか表示されません。 お答えいただければ幸いです。 以下はダウンロードプログラムです。 if ($_GET["no"]!="") { $re_no = $_GET['no']; $sql = "SELECT data FROM report WHERE re_no=$re_no"; $result = mysql_query($sql); if (!$result) { print("SQLの実行に失敗しました<BR>"); print(mysql_errno().": ".mysql_error()."<BR>"); exit; } $row = mysql_fetch_array($result); $row = mb_convert_encoding($row, "UTF-8", "UTF-8"); mysql_close($con); mb_http_output("pass"); header("Content-type: application/msword"); header("Content-Disposition: inline; filename=report.doc"); echo $row[0]; } ダウンロード用のリンクは <a href="repo.php?no={$row2.re_no}">DL</a> と表記しています。 ちなみに作成環境は以下のとおりです。 Apache/2.0.59 (Win32) PHP/5.2.3 MySQL クライアントのバージョン: 5.0.37 //*関係するデータベース*// mysql> describe report; +--------+------------+----+---+-------+---------------+ |Field |Type |Null|Key|Default|Extra | +--------+------------+----+---+-------+---------------+ |re_no |smallint(6) |NO |PRI|NULL |auto_increment | |seito_id|mediumint(9)|YES | |NULL | | |re_name |varchar(200)|YES | |NULL |utf8_general_ci| |data |blob |YES | |NULL | | |ka_id |smallint(6) |YES | |NULL | | +--------+------------+----+---+-------+---------------+
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- shimix
- ベストアンサー率54% (865/1590)
>ダウンロードリンクですが、re_nameを取得する形に変更してみたところ、 >ちゃんとre_nameを取得できました。 >なので、ファイルの指定は出来ていると考えられます。 了解です。では、DBへのデータ格納はどのようにされていますか?DBのblobデータはサイズも含めて問題ありませんか?(longblobじゃないのでちょっと気になる・・)
- shimix
- ベストアンサー率54% (865/1590)
(エラー表示に関して追記) たしかに標準でエラー抑制されるようです>php5。下記記事を参考にしてください。 http://okwave.jp/qa3784588.html #テスト用設定/本番用設定はずっと使いまわしているので気づかなかった(汗
- shimix
- ベストアンサー率54% (865/1590)
>$rowに関してですが、エラーや警告は表示されませんでした。 mb_convert_encodingの第一引数も戻り値もstringのハズですよね。エラー表示がerror_reportingの設定で抑制されているんですかねぇ。デバッグ時はエラー・警告ともFull表示にしておいた方がいいと思いますが・・。 >ダウンロード用のリンクは ><a href="repo.php?no={$row2.re_no}">DL</a> >と表記しています。 まず、実際のhtmlでこれがキチンと予定した内容になっているかは確認されましたか?またmysql_fetch_arrayの結果のチェックがないので、本当に「予定したSQL文が組み立てられているか」「予定した内容が取得出来ているか」を確認すべきだと思います。 dataじゃなくて、re_nameを取得するように書き替えて、$sqlとか$row[0]をprintしてみてください(バイナリを返している部分はいったんコメントアウトしておく)。 (蛇足) SQLインジェクション対策は「これから」だとは思いますが、それにしても危なっかしい記述です。
補足
エラー表記ですが、php.iniのdisplay_errorはOnにしています。 今までの他のエラーは表示されていました。 ダウンロードリンクですが、re_nameを取得する形に変更してみたところ、ちゃんとre_nameを取得できました。 なので、ファイルの指定は出来ていると考えられます。
- shimix
- ベストアンサー率54% (865/1590)
>$row = mb_convert_encoding($row, "UTF-8", "UTF-8"); $rowは配列だと思いますが、エラーor警告にはなりませんか?(error_reportingはどうなっていますか?) またblob(バイナリデータ)なのに、なぜmb_convert_encodingが必要なんでしょうか?格納時も取得時もMySQL側でのコード変換は行われていないハズですが・・。
補足
$rowに関してですが、エラーや警告は表示されませんでした。 最初はmb_convert_encodingを記述していなかったのですが、取得したwordファイルがwordで開けず、 テキストで開いたときに文字化けで見ることが出来る状態だったので、 エンコードが必要なのかな?と単純に足してみたものです。 BLOBだとエンコードは必要ないのですね。 だとすると問題点はエンコードではないのでしょうか?
補足
DBに格納されているデータは[BLOB - 23.5 KiB]です。 今後のことを考えると、longblobのほうがいいかもしれませんね。 アップロード時のプログラムは以下のとおりです。 $re_name = $_POST["re_name"]; $seito_id = $_POST["SEITO_ID"]; $ka_id = $_POST["KA_ID"]; $fp = @fopen($_FILES["uploadfile"]["tmp_name"], "rb"); $filedat = fread($fp, filesize($_FILES["uploadfile"]["tmp_name"])); fclose($fp); $filedat = addslashes($filedat); $conn = db_conn(); $sql = "INSERT INTO report (seito_id, re_name, data, ka_id) VALUES ('$seito_id', '$re_name', '$filedat', '$ka_id')"; アップロード用フォームの記述は以下のとおりです。 <FORM name="get_report" method="POST" action="{$app.url}" enctype="multipart/form-data"> <table> <tr> <INPUT type="hidden" name="KA_ID" value="{$row.ka_id}"> <INPUT type="hidden" name="SEITO_ID" value="{$app.seito_id}"> <td>ファイル:</td> <td><INPUT type="file" name="uploadfile"></td> </tr> <tr> <td> レポートタイトル:</td> <td> <INPUT type="text" name="re_name"> </td> </tr> <tr> <td></td> <td> <INPUT type="submit" name="submit" value="{$page.button_value}"> </td> </tr> </table> </FORM>