スレッド表示 | フラット表示〕 全トピック 920 件中 176 番目 次≫ ≪前

headerの二重送信

created: 2006-10-25 21:11 | modified: 2006-10-27 21:55 | reply: 5

[3418] headerの二重送信

user: 江戸川アダモ | created: 2006-10-25 21:11
久しぶりに投稿します。

画像が投稿できる掲示板を作っていて、フォームで投稿された元画像からサムネイルを作ってファイルとして保存したいのです。

その場合、リサイズした後HTTPヘッダで画像MIMEタイプを指定する必要があるようですが、そうするとそのページのHTMLヘッダとダブってしまいます。

先にHTMLヘッダを記述し、後で画像ヘッダを送信すると"header already sent..."エラーが出て、逆に画像ヘッダを先に送信すると、次にブラウザがHTMLをダウンロードしようとします。

もっとスマートな方法というか、とにかくサムネイル画像のファイルを作る処理をした上で、HTMLを記述する方法は無いのでしょうか?
ちなみに、ob_startとob_end_flushを使ってもheaderをダブルで送信することはできないと思うのですが。
reply: 3421 返信 編集 削除

[3421] 画像アップロード掲示板の仕組み

user: ゆうじ | created: 2006-10-26 23:52
こんばんわ。お久しぶりです。

お察しの通り、1回のリクエストで
複数の ContentType ヘッダを送信することはできません。

この処理は結果的に、
2回のリクエストで成り立ってますので
それぞれ処理を分ければよいわけです。

まずはじめのリクエストは画像のアップロードで、
このリクエストを受け、サーバが行うこの処理の中に、
サムネイル画像作成や画像保存があって、
最終HTMLを出力するまでが含まれます。
もちろんこの時の ContentType は text/html です。

2つ目は、先に出力したHTMLに書かれたIMGタグにより、
ブラウザが勝手おこなうリクエストです。
ここリクエストに対して、
先に保存した画像を出力する処理を行います。
この時の ContentType は iamge/jpeg などです。

一見、一連の処理に見えなくもありませんが、
リクエストとサーバの出力(処理)は常に1対1の関係なので、
画像の「保存」と「出力」で、別々に対応が必要ってことです。
こんな説明でイメージできますかね。

私も画像アップロード掲示板に触れたことはありませんが
どちらかの画像アップロード掲示板を参考にすれば
コードは拾えると思います。
Parent: 3418  reply: 3427 返信 編集 削除

[3427] RE:画像アップロード掲示板の仕組み

user: 江戸川アダモ | created: 2006-10-27 15:57
ゆうじさん、こんにちは。毎度アドバイスありがとうございます。

実際のスクリプトを交えて、仰ることを確認したいと思います。まずファイルの構成としては:

?投稿フォーム(form.html):スクリプトは無く、メッセージと画像ファイルのフォームです。

?入力内容チェック(check.php):これが問題の個所。
送信画像もサムネイルにしてこれで良いか確認したい。

*****************スクリプトとHTML****************

<?php

//ログイン認証(これが悪さをしていないでしょうね?)
session_start();
$name=$_SESSION['name'];
if(!isset($name)){
exit("ログインしないと投稿できません。");
}

//もし画像ファイルが送信されていたら以下の処理///////
if($_FILES['pic']['name']!=""){     

$fname=$_FILES['pic']['name'];
$temp=$_FILES['pic']['tmp_name'];

//テンポラリファイルに名前を付けて保存↓//
move_uploaded_file($temp,$target) or exit("file upload failed");

//サムネイルを作る↓
$size=getimagesize($target);
$yx=$size[1]/$size[0];
$sum=imagecreate(200,200*$yx);
$orig=imagecreatefromjpeg($target);
imagecopyresampled($sum,$orig,0,0,0,0,200,200*$yx,$size[0],$size[1]);

//【*1】サムネイルを画像として保存↓
header('content-type: image/jpeg');//ヘッダタイプの指定//
imagejpeg($sum,'/home/public_html/bbs/pic/sum/sum1.jpg');

}
?>

//HTMLを記述//
<html>
(<header>などが入る).........

<?php
(送られたメッセージを表示するスクリプトが入る)
?>

</html>

***************************************************

こうすると先に書いたように、最初の画像処理のスクリプトは実行されますが、HTML部分はブラウザで表示されずにファイルとしてダウンロードしようとします。

そこで、ゆうじさんが仰る「初めの処理」の中では上記【*1】の画像タイプヘッダの送信はこの時点では行わないということでしょうか?

すみませんが「初めの処理」と「2つめの処理」の意味をつかみかねていますので、スクリプトで具体的に示して頂けますでしょうか?
Parent: 3421  reply: 3428 返信 編集 削除

[3428] 画像保存時にheaderは不要

user: ゆうじ | created: 2006-10-27 17:10
> そこで、ゆうじさんが仰る「初めの処理」の中では上記【*1】の画像タイプヘッダの送信はこの時点では行わないということでしょうか?

その通りです。いりません。
ここで header('content-type: image/jpeg') を送信してしまうと、
これからブラウザに向けて
画像を送りますよってことになります。

imagejpeg
http://jp.php.net/manual/ja/function.imagejpeg.php

check.php については、
画像をファイルに保存したら、HTMLを出力して処理を終えます。
ここまでが私の言ってる、はじめのリクエストに対する処理です。


さて、出力されたHTMLには、送られたメッセージの他に、
画像を表示するためのIMGタグが書いてあると
想像していますが、違いますか?

<img src="/bbs/pic/sum/sum1.jpg">

これがあれば、ブラウザが勝手に2つ目のリクエストを発行して、
先ほど保存したサムネイル画像が表示されるとおもいます。
Parent: 3427  reply: 3429 返信 編集 削除

[3429] RE:画像保存時にheaderは不要

user: 江戸川アダモ | created: 2006-10-27 20:58
早速の返信ありがとうございます。

画像保存時にheaderは不要なんですか。
その時点で不要と言うだけでなく、imagejpeg()だけで画像の作成しサーバに保存ができるって事ですか?

そうすると確かにheader関数なんて使わなくても、HTML中に
<img src="/bbs/pic/sum/sum1.jpg">
を記述するだけでOKですよね。

私がやった時には、header('content-type: image/jpeg')の後にimagejpeg()にしないと画像が作成されない(FTPソフトで見ても存在しない)と思ったのですが…もう一度試してみます。
Parent: 3428  reply: 3431 返信 編集 削除

[3431] 画像保存時にheaderは不要でした

user: 江戸川アダモ | created: 2006-10-27 21:55
今試してみたのですが、header('content-type: image/jpeg')がなくても画像はできました。
(元々サーバ上だけで画像の作成/保存をするのに、何故ヘッダを送らないとできないのか不思議に思っていました。)

ちなみに勘違いした理由は、パーミッションの関係で画像ができない事と混同していたようです。

疑問が解けました。ありがとうございました。
Parent: 3429  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 176 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑