• 締切済み

phpプログラミングについて

php初心者です。 ファイルをダウンロードして保存するプログラムを作成しています。 ダイアログを表示させる形式をとっているのですが、保存されたファイルが正しく開けないんです。 ワードの場合だとファイルが壊れ、テキストファイルの場合、htmlのコードが一緒に入ってしまいます。 以下にソースコードと、ファイルの表示結果も載せるので、アドバイスお願いします。 [download.php] <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> <title>testdownload</title> </head> <body> テキストリンクの場合<br> <a href = "sample.php">sampleファイルをダウンロードする</a> <br><br> フォームボタンの場合<br> <form method = "post" action = "sample.php"><input type = "submit" value = "download"></form> </body> </html> [sample.php] <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> <title>downloadphp</title> </head> <body> <?php $path_file = "./test2.txt"; $path_file = mb_convert_encoding($path_file,"Shift_JIS","AUTO"); /* ファイルの存在確認 */ if (!file_exists($path_file)) { die("Error: File(".$path_file.") does not exist"); } /* オープンできるか確認 */ if (!($fp = fopen($path_file, "r"))) { die("Error: Cannot open the file(".$path_file.")"); } fclose($fp); /* ファイルサイズの確認 */ if (($content_length = filesize($path_file)) == 0) { die("Error: File size is 0.(".$path_file.")"); } /* ダウンロード用のHTTPヘッダ送信 */ header("Content-Disposition: attachment; filename=\"".basename($path_file)."\""); header("Content-Length: ".$content_length); header("Content-Type: application/octet-stream"); /* ファイルを読んで出力 */ if (!readfile($path_file)) { die("Cannot read the file(".$path_file.")"); } ?> </body> </html> [test2.txt] これはテストです。 [ダウンロード後のtest2.txt] <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> <title>downloadphp</title> </head> <body> これはテストです。 </body> </html> 以上、よろしくお願いします。

  • PHP
  • 回答数6
  • ありがとう数1

みんなの回答

  • nak2052
  • ベストアンサー率60% (3/5)
回答No.6

「中身がとれない」とはどう意味でしょうか? headerの部分をすべてコメントアウトして、ブラウザになにかエラーが表示されないかやってみてください。

  • nak2052
  • ベストアンサー率60% (3/5)
回答No.5

>で、上記のプログラムを、ファイル名を./files/サンプル1.docxに変更(filesというディレ >クトリにおいています。)したところ、ファイルの破損はなくなりましたが、変わりに中身 >がとれません。。 ファイル名はファイルの名前のみ。パスは付けない。 readfileに入れるファイルはパス付きのファイル。 私の例に合わせるなら $file = './files/サンプル1.docs'; $filename = 'サンプル1.docs'; になります。

taka_janu27
質問者

補足

説明不足ですみません。 その点は間違いなくやってます。 それでも中身が取れないんです。。

  • nak2052
  • ベストアンサー率60% (3/5)
回答No.4

参考にお使いください。 ファイルはLinux上に日本語名(UTF-8)で保存されているものとします。 クライアントはWindowsを前提にしています。 適当に書き換えてください。 <?php ini_set('display_errors', 1); $file = "/var/www/html/file/xxxx.doc";///ここでは、仮に。 $filename = "xxxx.doc";///ここでは、仮に。 $filneame = mb_convert_encoding($filename, 'SJIS-WIN', 'UTF8');///SJISでもいいですが、Windows上では化ける文字もあります。 //サーバがWindowsならおそらくココは必要ない。 header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.$filneame); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; ?> ・他の方ご指摘のとおり、HMLT内にPHPを埋め込む書き方ではできません。これ単体のPHPにします。 ・<?phpの前には何も書いてはいけません。空行もダメです。 ・セッションやクッキーも使えません。スクリプト内のヘッダーと衝突するからです。 ・Content-Lengthを出さないとファイル名がIE等では正しく表示されません。

taka_janu27
質問者

補足

とても丁寧な回答ありがとうございます。 >セッションやクッキーも使えません。スクリプト内のヘッダーと衝突するからです。 これはこのプログラム内で、ということですよね? で、上記のプログラムを、ファイル名を./files/サンプル1.docxに変更(filesというディレクトリにおいています。)したところ、ファイルの破損はなくなりましたが、変わりに中身がとれません。。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

(1)ヘッダを工夫してみてください <?PHP header("Content-Type: application/vnd.ms-word"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download");; header("Content-Disposition: attachment;filename=test.doc"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: public"); header("Content-Transfer-Encoding: binary "); readfile("hoge.doc"); exit; ?> (2)readfileは挙動が信用できないので きちんとopen→read→print→closeしてみてください

taka_janu27
質問者

補足

ありがとうございます。 1ですが、特に変化はありませんでした。 2に関してですが、 if (!readfile($path_file)) { die("Cannot read the file(".$path_file.")"); } の部分を $handle = fopen($file_path,"rb"); $filedata = fread($handle,$cotent_length); fclose($handle); に変える、という形でよいのでしょうか??

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 http://maranellog.blogspot.com/2008/04/php.html なんか参考になりませんでしょうか。 (これが原因と確信があるわけではありませんが・・・)

taka_janu27
質問者

補足

ありがとうございます。 参考のURLを見ましたが、そこの設定はデフォルトでpassになっていました。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 sample.phpのファイル出力処理がhtml内に入っているからではないでしょうか? ファイルを出力するのであればその処理のみphpに記述します。 <?php ?> にある処理のみでphpを作ってみてください。

taka_janu27
質問者

補足

回答ありがとうございます。 ご指摘の部分、phpのみにしてみたところ、テキストファイルに関してはうまくいきましたが、 ワードファイルは破損してしまいます。 「開いて修復」を実行すれば内容は受け取れるのですが・・・

関連するQ&A

  • PHPについて(初心者)

    はじめまして、PHPの初心者の者です。xamppをインストールしたあと、様々な設定をしました。その後、お問い合わせフォームというプログラムのために2つファイルを作りました。 一つ目は、inquiery.htmlというファイルで、ソースコードは <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS"> <title>お問い合わせフォーム</title> </head> <body> ■お問い合わせ内容を入力してください。 <br> <form action="check_inquiry.php" method="POST"> お問い合わせタイトル: <br> <input type="text" name="title" size="50"> <br> <br> <input type="submit" value="お問い合わせ内容の確認"> </form> </body> </html> というHTMLファイルで、入力した内容を、下の「check_inquiry.php」に飛ばします。その後、 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>お問い合わせフォーム</title> </head> <body> ■お問い合わせ内容を確認してください。 <br> お問い合わせタイトル: <br> <?php echo $_POST['title']; ?> </body> </html> check_inquiry.phpファイルでinquiry.htmlファイルの内容を受け取ります。 うまくいけば、$_POST['title' ]: でinquiry.htmlの内容を受け取るはずなのですが、うまくいきません。 inquiry.htmlの送信ボタンをクリックすると、check_inquiry.phpのソースコード全体が表示されてしまいます。 何が間違っているのかわかりません。もし、詳しい方がいましたら、アドバイスいただけないでしょうか?よろしくお願いします。

    • 締切済み
    • PHP
  • image1.phpを表示するHTMLでイメージが表示されません。

    image1.phpを表示するHTMLでイメージが表示されません。 <!-- form1.html --> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>form1</title> </head> <body> ※イメージを表示<br> <img src='image1.php' /> </body> </html> <!-- image1.php--> <?php chdir('data'); $path = 'image1.jpg'; $rpath = realpath($path); $size = filesize($rpath); $file = @fopen($rpath,'rb') or exit('ファイルが開けません。'); $img = fread($file,$size); fclose($file); header('Content-type','image/jpeg'); echo $img; ?> イメージとしてデータを送信するPHPと、そのPHPをイメージとして表示するHTMLです。 HTMLからアクセスしてイメージを表示させたいのですが、どのようにしたらいいか教えてください。

    • ベストアンサー
    • PHP
  • PHPに関して質問です

    簡単な問い合わせフォームを作っていますが HTMLページで入力した文章がPHP画面で表示できません。 ソースは <html> <head> <meta http-equiv="Content-Type" content="text/html; charset_JIS"> <tittle>お問い合わせフォーム</tittle> </head> <body> ■お問い合わせ内容を入力してください。 <br> <form action="check_inquiry.php" method="POST"> お問い合わせタイトル: <br> <input type="text" name="tittle" size="50"> <br> <br> <input type="submit" value="お問い合わせ内容の確認"> </form> </body> </html> と <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <tittle>お問い合わせフォーム</tittle> </head> <body> ■お問い合わせ内容の確認をしてみてください。 <br> お問い合わせタイトル: <br> <?php echo $_POST["tittle"]; ?> </body> </html> どこが問題なのでしょうか?

    • 締切済み
    • PHP
  • PHP重複ファイルに連番をつけてアップロードしたい

    ファイルをアップロードするページをPHPで作りました。 testup.htmlでファイルを選択し、 testup.phpでファイルをサーバーにアップする 簡単な仕組みです。 アップロードには成功したのですが、 同じファイル名のデータがある場合、上書きされてしまいます。 上書きされずに、連番等をファイル名に追加してアップロード できればと思いましたが、方法がわかりません。 当方PHPの初心者です。何卒お力をお貸しください。 よろしくお願い致します。 ソースを記入しておきます。 「testup.html」 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>test</title> </head> <body> テストアップローダー<br> <form action="testup.php" method="post" enctype="multipart/form-data"> アップロードするファイルを選択してください。 <br> <input type="file" name="upfile" size="30"><br> <br> <input type="submit" value="アップロード"> <label>  <input type="reset" name="button" id="button" value="リセット" /> </label> </form> </body> </html> 「testup.php」 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>test</title> </head> <body> <p><?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . $_FILES["upfile"]["name"])) { chmod("files/" . $_FILES["upfile"]["name"], 0777); echo $_FILES["upfile"]["name"] . "をアップロードしました。"; echo "<br><br>ありがとうございました。"; echo "<br><FORM><INPUT TYPE=button value=閉じる onClick=window.close()></FORM>"; } else { echo "ファイルをアップロードできません。"; echo "<br>お手数ですが前の画面に戻ってもう一度ファイルをアップロードしてください。"; echo "<br><FORM><INPUT TYPE=button value=前のページに戻る onClick=JavaScript:history.back()></FORM>"; } } else { echo "ファイルが選択されていません。"; echo "<br>お手数ですが前の画面に戻ってファイルを選択してください。"; echo "<br><FORM><INPUT TYPE=button value=前のページに戻る onClick=JavaScript:history.back()></FORM>"; } ?></p> </body> </html>

    • ベストアンサー
    • PHP
  • PHPでファイルのアップロード

    OSはLinuxのfedoraを利用しており、WebサーバーソフトはApacheを利用しています。 PHPを使って、クライアントからサーバーにファイルのアップロードをしたいのですが、プログラミングがあまり理解できておらず、アップロードができません。ちなみにphp.iniファイルの設定に関しては、アップロードは受け付けるようにしていますし、設定にミスはないと思います。 sample.phpというファイル名で下記のファイルを作ってみたのですが、アップロードすることができませんでした。まだPHPは初心者で間違いだらけだと思うのですが、こうすればアップロードできるようになるといった指摘をお願い致します。 <html> <head> <title> </title> </head> <body> <form enctype="multipart/form-data" action="sample.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> Send this file: <input name="userfile" type="file"> <input type="submit" value="Send File"> </form> <?php if(isset($uploadfile) and is_uploaded_file($uploadfile)) { if(move_uploaded_file($uploadfile, $path . "/var/www/html/test/" . $uploadfile_name)){ print("<br>Uploaded file saved."); }else{ print("<br>Uploaded file save failed."); } } ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHPについて教えてください

    下記のindex.htmlとcheck.phpを別々にURLに入力すると正しく表示されるのですが 横の送信ボタンを押したときにcheck.phpにジャンプしてくれません どうしてでしょうか? index.html <DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PHP基礎</title> </head> <body> <from method="post" action="check.php"> <input name="nickname" type="text" style="width:100px"> <input type="submit" value="送信"> </from> </body> </html> check.php <DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PHP基礎</title> </head> <body> <?php print'ようこそ'; ?> </body> </html>

    • 締切済み
    • PHP
  • PHPをはじめて1日目なので・・・

    参考書を見ながらPHPの勉強を始めていますが、本のサンプルと全く同様にコーディングしているはずなのに、良い結果が得られずバグとなります。 formとpostを使って内容を渡すという項目なのですが。 form.htmlの内容。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form method="post" action="form1.php"> 好きな食べ物は?<input type="text" name="food1"><br> 好きな飲み物は?<input type="text" name="food2"> <input type="submit" value="送信"> </form> </body> </html> form1.phpの内容 <?php header('Content-type: text/html; charset=UTF-8'); ?> <html> <body> <?php $f1 = $_POST['food1']; $f2 = $_POST['food2']; $f1 = htmlentities( $f1, ENT_QUOTES, 'UTF-8' ); $f2 = htmlentities( $f2, ENT_QUOTES, 'UTF-8' ); echo 'あなたは「', $f1, "」が好きなんですね。<br>\n"; echo '「', $f2, "」も好きなんですね。<br>\n"; ?> </body> </html> おそらくちょっとしたことが原因でエラーが出ているのだと思いますが、まだ始めて1日目なので、どこがいけないのかさっぱりわかりません。 一体どこがおかしいのか、教えていただけますか?

    • ベストアンサー
    • PHP
  • phpでメール送信

    phpでメール送信を行ってもメールが来ません。 普通のメールアドレスです。使っているサーバーはちゃんとphpが つかえるようです。ソースは下記です。訂正するところなどありまし たらよろしくお願いします。 ソース:(ホーム)<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>sample</title> </head> <body> <form action="1.php" method="post"> ホームページの名前:<br> <input type="text" name="subject" size="30" value=""><br> ホームページのアドレス:<br> <input type="text" name="name" size="30" value=""><br> メールアドレス:<br> <input type="text" name="mail" size="30" value=""><br> ホームページの紹介文:<br> <textarea name="message" cols="30" rows="5"></textarea><br> <br> <input type="submit" value="送信する"> </form> </body> </html> 送信側:<?php mb_language("Japanese"); mb_internal_encoding("SHIFT-JIS"); $message = "ホームページのアドレス:" . $_POST["name"] . "\nホームページの紹介文:" . $_POST["message"]; if (!mb_send_mail("めーるアドレス@メールアドレス.jp", $_POST["subject"], $message, "From: " . $_POST["mail"])) { exit("メールの送信に失敗しました。"); } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>sample</title> </head> <body> <p>メールが送信されました。</p> </body> </html>

  • phpのプログラミング

    phpの事について質問があります。 画像をアップロードしてデーターベースに画像のパスを入れるプログラミングに挑戦中なのですが、 うまくいかないので詳しい方アドバイスお願い致します 作っているプログラミングの流れは 1の画面で画像選択とコメントの入力 2の画面で画像の確認とコメントの確認 3の画面で『登録しました』の文言の表示とサーバへの書き込み (今回は3の画面では確認の為echo文で飛んでいるかどうかの確認のみ行っております) ちなみにアップロードはうまくいっており、uploadsというディレクトリーを作ってそこに画像をUPしております を考えているのですが、 2画面でinput typeのhiddenを使ってコメントと画像のパスを3の画面に飛ばそうと思っているのですが、 コメントは3の画面に飛んでいるのに、画像のパスが3の画面に飛んでないみたいです、画像のパスはinput typeのhidden で飛ばす事は出来ないのでしょうか? プログラミング以下のような感じです 2の画面 confirm.php <!DOCTYPE html> <html> <head> <meta charset=UTF-8" /> <title>確認画面</title> </head> <body> <h3>以下の内容で登録しますか?</h3> <?php $message=$_POST['message']; ?> <form action="entry.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="message" value="<?php echo $message; ?>"> <input type="hidden" name="upload_name" value="<?php echo $upload_name; ?>"> メッセージ <?php echo $message;?><br /> 画像 <?php $file_name = $_FILES['filename']['name']; $file_type = $_FILES['filename']['type']; $temp_name = $_FILES['filename']['tmp_name']; $dir ='uploads/'; $upload_name = $dir.$file_name; $result = move_uploaded_file($temp_name,$upload_name); ?> <br /> <?php if($result){ echo'■アップロード成功'; $image_size =getimagesize($upload_name); } else{ echo'■アップロード失敗'; } ?> <?php echo $upload_name;?> <input type="submit" value="登録する"> </form> </body> </html> 3の画面 entry.php <!DOCTYPE html"> <html> <head> <meta charset=UTF-8> <title>登録画面</title> </head> <body> <?php echo $_POST['message']; ?> <?php echo $_POST['upload_name']; ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHPがどうしても反映されません

    ソフトバンク携帯から画像を転載できないようにする方法をいろいろと 模索した結果、PHPが有効だということがわかりました。 http://apachephp.seesaa.net/category/1648379-1.html 上記のサイトを参考にし、以下のようにつくってみました。 --------------------test.htmlの内容------------------------------ <?xml version="1.0" encoding="shift_jis"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <title>テスト</title> </head> <body> <img src="http://xxx.jp/test.php" /> </body> </html> ---------------------ここまで------------------------------------- ---------------------test.phpの内容------------------------------ <?php header('Content-Type: image/jpeg'); header('x-jphone-copyright: no-transfer'); @readFile('http://xxx.jp/01.jpg'); ?> --------------------ここまで-------------------------------------- 理想は、「http://xxx.jp/test.html」を開くと「http://xxx.jp/01.jpg」 の画像が表示されることです。 まず、レンタルサーバの環境ですが、PHPに対応しております。 ためしに、test.phpの内容を <?php echo 'test'; echo 'てすと'; ?> とし、http://xxx.jp/test.phpに直接アクセスしてみました。 すると、「test」はきちんと表示されました。 けれど、「てすと」はなぜか文字化けしてしまいました。 「test.php」の内容を <?php header('Content-Type: image/jpeg'); @readFile('http://xxx.jp/01.jpg'); ?> と、「header('x-jphone-copyright: no-transfer');」を消し test.htmlにアクセスしてみました。 けれど、画像は表示されませんでした。 そのほか、外部へのアクセスではなく、test.htmlの「body」内に直接 <?php header('Content-Type: image/jpeg'); header('x-jphone-copyright: no-transfer'); @readFile('http://xxx.jp/01.jpg'); ?> を入力した場合は表示されるかどうかを試してみました。「body」内に 入力を終えたあと、「http://xxx.jp/test.html」に直接アクセスしてみま したがやはり画像は表示されません。 あとは、「@readFile」の@をはずしてみたり、「readfile」とFを小文字に してみたり、「'」を「"」に変更してみたり……。 わたしなりに考えうる手はつくしました。検索エンジンでもいろいろと 検索して調べてみました。しかし、どうしても解決できませんでした。 そこで、上級者のお知恵をお借りしたく思い、教えてgooへ質問いたしました。 どうかご教授のほど、よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう