![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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 | |
+--------+------------+----+---+-------+---------------+
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>ダウンロードリンクですが、re_nameを取得する形に変更してみたところ、
>ちゃんとre_nameを取得できました。
>なので、ファイルの指定は出来ていると考えられます。
了解です。では、DBへのデータ格納はどのようにされていますか?DBのblobデータはサイズも含めて問題ありませんか?(longblobじゃないのでちょっと気になる・・)
この回答への補足
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>
No.3
- 回答日時:
(エラー表示に関して追記)
たしかに標準でエラー抑制されるようです>php5。下記記事を参考にしてください。
http://okwave.jp/qa3784588.html
#テスト用設定/本番用設定はずっと使いまわしているので気づかなかった(汗
No.2
- 回答日時:
>$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を取得できました。
なので、ファイルの指定は出来ていると考えられます。
No.1
- 回答日時:
>$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だとエンコードは必要ないのですね。
だとすると問題点はエンコードではないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DBで検索結果に該当するデータ...
-
文字化けが解決できません。お...
-
アラートでyes noを作りたいです。
-
mysql_insert_id()の使い方
-
checkboxクリック時、SQLを実行...
-
phpでの更新ができません。
-
mysqlテーブルから一つレコード...
-
mysqlから取得した配列をカンマ...
-
smartyでMySQLから連想配列取り...
-
SELECT結果から動的にコンボボ...
-
実行時エラー3131 FROM 句の構...
-
MySQLでデータベースにデータin...
-
VBAをつかってクエリの情報を抽...
-
<VB.NET>INSERT文でDBにデータ...
-
ResultSetインターフェイスでの...
-
テキストボックスに入れた内容...
-
insert1つの処理でもトランザ...
-
Pro*Cの構文エラー
-
日またぎの計算
-
csvをDBへ読み込んだら、NULLが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPで[]の使い方について
-
エクセルVBAについて
-
DBで検索結果に該当するデータ...
-
アラートでyes noを作りたいです。
-
phpでmysqlを使ってデータベー...
-
checkboxクリック時、SQLを実行...
-
dbに登録したデータをphpのプル...
-
PHP+MySQLでの配列のinsert文に...
-
pg_queryの結果を2回とりだす...
-
検索結果($_POST)が2ページ目...
-
PHPについてなのですが未定義の...
-
VBA初心者です。
-
sortable ギブアップです…助け...
-
PEAR::DBで取得したデータで処...
-
DBのデータを表示させたい
-
データベース表示結果のデザイン
-
PHP 勤務時間の合計を出したい
-
mySQLからデータを取り出す
-
PHP と MySQL でテーブルの行数...
-
連想配列、オブジェクト配列の...
おすすめ情報