-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtopic-post180.html
242 lines (222 loc) · 22.3 KB
/
topic-post180.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<title>日本PHPユーザ会 掲示板: PHP事はじめ » HTMLの送信とファイルのダウンロードを同時にするにはどうするのですか</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="description" content="日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。" />
<meta name="keywords" content="php,web,php.gr.jp,community,usebb" />
<link rel="stylesheet" type="text/css" href="./templates/phpgrjp0.3/styles.css" />
<link rel="shortcut icon" href="./templates/phpgrjp0.3/gfx/usebb.ico" />
<link rel="alternate" type="application/rss+xml" title="日本PHPユーザ会 掲示板 RSS フィード" href="rss.xml" />
<script type="text/javascript" src="sources/javascript.js"></script>
</head>
<body onload="javascript:init_external()">
<div id="pagebox-bg">
<div id="shadow-left">
<div id="shadow-right">
<p id="logo"><a href="index.html"><img src="./templates/phpgrjp0.3/gfx/usebb.png" alt="UseBB" title="ホーム" /></a></p>
<h1 id="boardname"><span id="line">日本PHPユーザ会 掲示板</span></h1>
<h2 id="boarddescr">日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。</h2>
<div id="topmenu"><ul>
<li><a href="index.html">ホーム</a></li><li><a href="faq.html">FAQ</a></li><li><a href="active.html">活発なトピック</a></li>
</ul></div>
<div id="topmenu-shadow"></div>
<p class="locationbar">
• <a href="index.html">日本PHPユーザ会 掲示板</a> » <a href="forum-2.html">PHP事はじめ</a> » HTMLの送信とファイルのダウンロードを同時にするにはどうするのですか
</p>
<h3 id="forumname"><a href="topic-72.html">HTMLの送信とファイルのダウンロードを同時にするにはどうするのですか</a></h3>
<p id="forummods"></p>
<p id="toolbartop"> </p>
<p id="pagelinkstop">ページ: 1</p>
<table class="maintable">
<tr>
<th>投稿者</th>
<th>投稿</th>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-104.html">YON</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post178.html#post178" name="post178" rel="nofollow">#1</a> 2008 年 6 月 19 日(木) 10:31</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 6 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post"><img src="./templates/phpgrjp0.3/smilies/sad.gif" alt=":(" /> 例えば、htmlのフォームで処理したいファイル名指定して、PHPファイルに送信します。<br />PHP側では、受取ったファイル名のファイルを読み込んで、処理した後、出力します。<br />このような時<br />function dataout($fname){<br /> header(attachment;filename={$_FILES['upfilename']['name']}");<br /> header("Content-Type: application/x-csv");<br /> header("Content-Length: .filesize($fname)");<br /> readfile($fname);<br />}<br />で、ファイルをダウンロードさせる事が出来るのですが、このfunctionで、<br />ダウンロードさせる前に、print文やhtmlタグで、処理内容等を表示させていると、<br />表示されず、全部ダウンロードするファイルの中身といっしょに送られてしまいます。<br /> header出力は一度しか出来ないのでしょうか、マルチパートにしたい時はどうすれば<br />よいのでしょうか?<br />(以上 )<div class="editinfo">« 最終編集者 <a href="profile-104.html">YON</a> 日時 2008 年 6 月 19 日(木) 10:34. »</div></div>
</td>
</tr>
<tr class="tr2">
<td class="postername">
<div class="posternamecontainer"><a href="profile-104.html">YON</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post179.html#post179" name="post179" rel="nofollow">#2</a> 2008 年 6 月 19 日(木) 11:15</div>
</td>
</tr>
<tr class="tr2">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 6 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post"><img src="./templates/phpgrjp0.3/smilies/confused.gif" alt=":?" /> 以下の方法を思いつきました。難しいかも知れませんが。<br />①予めダウンロードさせるPHP(download.php)を別に作っておく。<br />②呼び出されたPHPは、自身のHTML出力が終った後、<br />function calldownload(){<br /> $host = $_SERVER['HTTP_HOST'];<br /> $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');<br /> $extra = 'download.php';<br /> header("Location: <a href="http://$host$uri/$extra"" title="http://$host$uri/$extra"" rel="external">http://$host$uri/$extra"</a>;);<br /> exit;<br />}<br />を呼び出して、download.phpに遷移するようにする。<br />です。この時、「ダウンロードさせるファイル名をどうやって引き渡せばよいか」<br />ですが、クッキーとか、セッションとかを使えば出来そうな気がします。<br />それとも、呼びだすURLの後ろに、<br /> $extra = 'download.php?file=filename';<br />と付けて、download.phpで単純に受取れるかもしれません。<div class="editinfo">« 最終編集者 <a href="profile-104.html">YON</a> 日時 2008 年 6 月 19 日(木) 11:19. »</div></div>
</td>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-28.html">SAYKA</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post180.html#post180" name="post180" rel="nofollow">#3</a> 2008 年 6 月 19 日(木) 17:49</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 9 2007</div>
<div class="field">返信数: 9</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">通常はmailの話だけど<br /><a href="http://www.google.co.jp/search?q=mime%20multi&hl=ja&lr=lang_ja" title="http://www.google.co.jp/search?q=mime%20multi&hl=ja&lr=lang_ja" rel="external">http://www.google.co.jp/search?q=mime%20multi&hl=ja&lr=lang_ja</a><br />試してないから判らないけどこれでできたりしないかな?</div>
</td>
</tr>
<tr class="tr2">
<td class="postername">
<div class="posternamecontainer"><a href="profile-36.html">kona@m</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post181.html#post181" name="post181" rel="nofollow">#4</a> 2008 年 6 月 19 日(木) 17:58</div>
</td>
</tr>
<tr class="tr2">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 10 2007</div>
<div class="field">返信数: 71</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">こんにちは。<br /><br />少し気がついたのですが、PHPマニュアルに<br /><blockquote class="quote"><div class="title">引用</div><div class="content">覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。</div></blockquote> <br />となっていますので、その方法だとエラーになるかと思います。<br /><br />そこで、Javascriptを使う方法はいかがでしょうか?。呼び出されたPHPが出力するHTMLの中に、「ページが表示された時にdownload.phpを呼び出すJavascript」を入れておくのです。<br />ファイル名の受け渡しはセッションを使うのが手っ取り早いかもしれません。</div>
</td>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-104.html">YON</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post182.html#post182" name="post182" rel="nofollow">#5</a> 2008 年 6 月 20 日(金) 19:15</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 6 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post"><img src="./templates/phpgrjp0.3/smilies/smile.gif" alt=":)" /> ヒントをいただき、ありがとうございました。やはりheader("Location: を使うやり方はだめでした。<br />そこでkona@mさん提案のJavascriptと併用する方法で、特にセッションもクッキーも使わずに出来ました。<br />以下のようにやりました。(ご参考までに)<br /><strong>(最初にリクエストを投げるhtmlのフォーム:yygeocodingm.htm)</strong><br /><strong><form name="upform" id="upform" action="http://yoneyone.my-sv.net/php/geocodingm.php"<br /> method="post" enctype="multipart/form-data" ></strong><br />Geocoding サービスの選択<br /><select name="service[]" id="service" /><br /> <option value="google" />google<br /> <option value="yahoo" />yahoo<br /></select><br><br><br />住所ファイルの選択<br /><input type="file" name="upfilename" id="upfilename" /><br /><input type="submit" name="submitbotton" id="submitbotton" value="送信" /><br><br /><input type="reset" name="reset" value="クリア" /><br /></form><br /><br /><strong>(処理するPHP:geocodingm.php)</strong><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><br /><html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"><br /><head><br /><meta http-equiv="content-type" content="text/html; charset=EUC-JP"/><br /><META http-equiv="Cache-Control" content="no-cache"><br /><META http-equiv="Expires" content="0"><br /><title>YY GeoCoding 結果</title><br /><script type="text/javascript"><br />//<![CDATA[<br /><strong> <u>function back(){</u><br /> location.href="http://yoneyone.my-sv.net/<u>yygeocodingm.htm</u>";<br /> }<br /> <u>function closing(filename){</u><br /> location.href="http://yoneyone.my-sv.net/php/<u>yygoddel.php?fname=" + filename;</u><br /> }<br /> <u>function download(filename){</u><br /> location.href="http://yoneyone.my-sv.net/php/<u>yygodown.php?fname=" + filename;</u><br /> }</strong><br />//]]><br /></script><br /><?php<br /> if (!empty($_FILES['upfilename']["name"])){<br /> $service=$_POST['service'][0];<br /> if (is_uploaded_file($_FILES['upfilename']['tmp_name'])){<br /> $fname = "../temp/" . $_FILES['upfilename']["name"];<br /> <strong>print "<body onunload=\"closing('$fname')\">";</strong><br /> $fin = fopen($_FILES['upfilename']['tmp_name'],"rb");<br /><br /> 処理本体(省略)<br /><br /> print "<hr><br><b>";<br /> <u>print " $service で $count 件の住所の検索が完了しました。</u><br><br>";<br /> <u>print "処理時間は $syori_jikan 秒でした。</u><br><br>";<br /> <strong>print "<form action=# name='downform' id='downfom'>";<br /> print "<input type='button' name='backbtn1' <br /> <u>value='検索結果ファイルの受信' onClick='download(\"$fname\")'>";</u><br /> print "<input type='button' name='backbtn2' <br /> <u>value='終了' onClick='closing(\"$fname\")' />";</u><br /> print "</form>";</strong><br /> print "<hr></b>";<br /> print "<font color=#ff1493><b>※(注意:FireFox等のタブブラウザーでご利用の方へ)</font></b><br>";<br /> print "<font color=#008b8b><b>!</b>ダウンロードを行なわないで終了する場合、終了ボタンで終了してください。";<br /> print "ブラウザーの戻るボタンで終了すると、ごみが残ります。</font><br>";<br /> }<br /> }else{<br /> <u>print "<body>"</u>;<br /> <u>print "送信ファイルを選択して下さい。<br><br>";</u><br /> <strong>print "<form>";<br /> print "<input type='button' name='backbtn1' <u>value='戻る' onClick='back()' />";</u><br /> print "</form>"</strong>;<br /> }<br />?><br /></body><br /></html><br /><br /><strong>(ダウンロードさせるPHP:yygodown.php)</strong><br /><?php<br /><u>$fname = "{$_REQUEST['fname']}";</u><br />$faray =explode("/",$fname);<br />$downname = $faray[count($faray)-1];<br /><strong>header("Content-Disposition: attachment; filename=$downname");<br />header("Content-Type: application/x-csv");<br />header('Content-Length:'. filesize($fname));</strong><br />readfile($fname);<br />unlink($fname);<br />?><br /><br /><strong>(取り消しのPHP:yygoddel.php)</strong><br /><?php<br /><u>$fname = "{$_REQUEST['fname']}";</u><br />if(file_exists($fname)){<br /> unlink($fname);<br />}<br /> <strong>header("Location: <a href="http://yoneyone.my-sv.net/yygeocodingm.htm"" title="http://yoneyone.my-sv.net/yygeocodingm.htm"" rel="external">http://yoneyone.my-sv.net/yygeocodingm.htm"</a>;);<br />?></strong><br /><br />で、一応期待どうりにできました。<br /><a href="http://yoneyone.my-sv.net/yygeocodingm.htm" title="http://yoneyone.my-sv.net/yygeocodingm.htm" rel="external">http://yoneyone.my-sv.net/yygeocodingm.htm</a> で試してみてください。<br /> <img src="./templates/phpgrjp0.3/smilies/sad.gif" alt=":(" /> 問題が少々あります。<br />PHPが原因ではないのかもしれませんが、FireFoxのブラウザーの戻るのボタンでPHP<br />で出力したページから戻る時、<body>タグで指定したJavascriptの<strong>onunload=xxx('')の関数が動きません</strong>。IE(6.0)ではブラウザーの戻るボタンで<strong>onunload</strong>イベントが<br />ちゃんと検出されているのですが....。他のブラウザーは試していません。<br />(以上)</div>
</td>
</tr>
<tr class="tr2">
<td class="postername">
<div class="posternamecontainer"><a href="profile-36.html">kona@m</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post184.html#post184" name="post184" rel="nofollow">#6</a> 2008 年 6 月 21 日(土) 23:49</div>
</td>
</tr>
<tr class="tr2">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 10 2007</div>
<div class="field">返信数: 71</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post">とりあえず本来の目的が達成できたようで良かったですね。<br /><br />(すみません、これよりPHPの話からはそれてしまうかもしれません。>他の皆様)<br /><br />で、Firefoxでの動作についてですが、この投稿に書かれていたgeocodingm.phpの出力部分をコピーペーストしてローカルなテスト環境を作ってみました。「location.href=」の部分をalert()に置き換えて、Firefox3にて表示・ページ移動させてみたところ、onunloadイベント自体は発動しているように見えます。<pre class="code">function back(){<br />alert("http://yoneyone.my-sv.net/yygeocodingm.htm");<br />}<br />function closing(filename){<br />alert("http://yoneyone.my-sv.net/php/yygoddel.php?fname=" + filename);<br />}<br />function download(filename){<br />alert("http://yoneyone.my-sv.net/php/yygodown.php?fname=" + filename);<br />}<br /></pre>(こんな感じに変えてみました)<br />Firefox2はもう消してしまったのでわかりませんが・・・。<br /><br />あとPHPでアップロードファイルから処理して別のファイルを返すというと、アップロードの受信・ファイル出力・ゴミファイルの削除が一度のリクエストで処理できるようになればいいのかもしれませんが、ちょっと今は実現できるかどうかわかりません。もしそれが出来れば根本的な解決が出来るのでは?と思ってみたりしますが、どうでしょうか。<br /><br />それと、SAYKAさんのアイデアも面白そうですね。「サーバープッシュ」で検索するとより近いかもしれません。<br /><br />p.s.初めてonunloadイベントを使ってみました。今までピンと来ていなかったのですが、試してみたら何か使えそうな気がしてきました。ありがとうございました。</div>
</td>
</tr>
<tr class="tr1">
<td class="postername">
<div class="posternamecontainer"><a href="profile-104.html">YON</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post189.html#post189" name="post189" rel="nofollow">#7</a> 2008 年 6 月 24 日(火) 17:48</div>
</td>
</tr>
<tr class="tr1">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 6 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post"><PHPの話からはそれているので、あまり深堀りしませんが><br /><br /> <img src="./templates/phpgrjp0.3/smilies/confused.gif" alt=":?" /> Firefoxでは、location.hrefの使い方に制限があるようです。<br />FirefoxでもonUnloadイベントで呼ばれる関数は、ちゃんと実行されていました。<br />alert()で確認出来ました。しかし、location.href=xxxで代入した場合、<br />URIの?以降がセットされないようです。<br />location.sarch とか、location.reload とかいろいろ試しましたが、<br />onUnloadイベントで呼ばれた場合はだめなようです。<br />location.hrefはIEとかなり動作が違うみたいで、<br /><a href="http://blog.gpso.info/javascript_ajax/" title="http://blog.gpso.info/javascript_ajax/" rel="external">http://blog.gpso.info/javascript_ajax/</a><br />にも、PHPとのシームレス通信について、参考になりそうな例がありましたが、<br />これ以上複雑にしても苦しいので、戻るボタンでphpを呼び出すのはあきらめます。<br />どうもありがとうございました。<div class="editinfo">« 最終編集者 <a href="profile-104.html">YON</a> 日時 2008 年 6 月 24 日(火) 17:49. »</div></div>
</td>
</tr>
<tr class="tr2">
<td class="postername">
<div class="posternamecontainer"><a href="profile-104.html">YON</a></div>
</td>
<td class="postinfo">
<div class="postlinks"></div>
<div class="postdate"><a href="topic-post190.html#post190" name="post190" rel="nofollow">#8</a> 2008 年 6 月 24 日(火) 18:12</div>
</td>
</tr>
<tr class="tr2">
<td class="posterinfo">
会員
<div class="avatar"></div>
<div class="field">登録者: 6 2008</div>
<div class="field">返信数: 5</div>
<div class="field"></div>
</td>
<td class="postcontent">
<div class="post"><img src="./templates/phpgrjp0.3/smilies/smile.gif" alt=":)" /> 追記<br />サーバプッシュとかクライアントプルとか概念は何となく解るのですが、自分で実装するとなると<br />いろいろな知識が必要で、素人にはとっても難しそうです。 <br />せいぜい、簡単なAJAXなページを作るぐらいです。<br />今回のページも、Javascriptを主体に、ファイルI/O部分、クロスドメインアクセス部分のみPHPのCGIにする事も出来たのですが、PHP学習のため、PHPを主体に作ろうと思ったので、苦労する事になりました。一方、文字コードのハンドリングや、ファイルI/O等、PHPだからこそ楽に作れた部分もありました。<br />(以上)</div>
</td>
</tr>
</table>
<p id="toolbarbottom"> </p>
<p id="pagelinksbottom">ページ: 1</p>
<div id="bottomfix"></div>
<p id="actionlinks"></p>
<p class="locationbar">
• <a href="index.html">日本PHPユーザ会 掲示板</a> » <a href="forum-2.html">PHP事はじめ</a> » HTMLの送信とファイルのダウンロードを同時にするにはどうするのですか
</p>
<p id="linkbar">
</p>
<p id="bottom">
日本PHPユーザ会 掲示板 は <a href="http://www.usebb.net">UseBB 1 フォーラムソフトウェア</a> を使用しています
</p>
<div id="bottom-shadow"></div>
</div>
</div>
</div>
</body>
</html>