出産前後の痔にはご注意!

PHPについて質問です。

MSG,ZIPファイルダウンロードサイト作成しております。
ダウンロードして指定のフォルダに格納するところまではできました。

プログラムには、
$file_name= mb_convert_encoding($file_name,"sjis-win","UTF-8");
これを記載しています。

ダウンロードしたファイルをクリックすると、
「テキストファイル処理の確認」という、
文字コードを選択できるダイヤログが出てきます。
それを押しても開くことはできません。

どうしたらいいのでしょうか?
説明不足かと思いますので、ヒントだけでも教えていただけるとありがたいです。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>「圧縮(zip形式)が無効であるか、または壊れています」


>とメッセージがでます。

ほぉ・・・
>basename($filename)
ということはZIPファイルはPHPで圧縮したのではもともとZIPとして
おいてあるということで間違いないですね?

もちろん
$content_length = filesize($filename);
はしていますよね?

ちなみにもともとアップされているファイルと、ダウンロード
してきたファイルのサイズに差異はないでしょうか?

この回答への補足

ということはZIPファイルはPHPで圧縮したのではもともとZIPとして
おいてあるということで間違いないですね?
★そうです。ですが、リネームしてます。

もちろん
$content_length = filesize($filename);
はしていますよね?
★追加してみましたが、ダメでした。

ちなみにもともとアップされているファイルと、ダウンロード
してきたファイルのサイズに差異はないでしょうか?
★差異がありました。

お手数おかけしますが、よろしくお願いします。

補足日時:2011/09/08 14:07
    • good
    • 0

うーん・・・


単純に拡張子が.ZIPになっていないとかじゃないでしょうか?

PHPのカテゴリーでの質問とのことですから
プログラムでZIPを吐き出しているのですかね?
であればきちんとhttpヘッダーはつけていますか?

たとえばこんな感じ・・・

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"download.zip\"");

この回答への補足

またまた迅速なご返答ありがとうございます。

zipで吐き出しています。
ヘッダーは下記のように設定済みです。

header("Content-Disposition: attachment; filename=\"".basename($filename)."\"");
header("Content-Length: ".$content_length);
header("Content-Type: application/octet-stream");
header('Content-Transfer-Encoding: binary');

ご質問の件、試してみましたがZIPで吐き出されていることは確かでした。。
そこでまた質問なのですが、
ZIPファイルを「プログラムから開く→フォルダを指定する」
と、
「圧縮(zip形式)が無効であるか、または壊れています」
とメッセージがでます。

これはプログラムの問題でしょうか?
私のPCの問題なのでしょうか?

初歩的な質問で申し訳ありません。
よろしくお願いします。

補足日時:2011/09/08 12:36
    • good
    • 0

必要な情報がまったく伝わってこないのですが・・・


もうすこし仕様をきちんと説明してください

(1)自サイトにZIPがおいてある?
(2)そのZIPの中身はテキストファイル?
(3)それをクライアントPCにダウンロードさせる?

>ダウンロードしたファイルをクリックすると、
>「テキストファイル処理の確認」という、

ZIPファイルをクリックしてこのエラーがでるということですか?
ZIPの解凍をした上で、中身を開いたらどうなりますか?
それとも解凍ができないということ?

この回答への補足

迅速な対応ありがとうございます!

(1)自サイトにZIPがおいてある?
★はい

(2)そのZIPの中身はテキストファイル?
★テキストファイルもあります。他にもいろいろ。

(3)それをクライアントPCにダウンロードさせる?
★そうです。クリックしたら自動的にダウンロードしたいです。

ZIPファイルをクリックしてこのエラーがでるということですか?
★そうです。

ZIPの解凍をした上で、中身を開いたらどうなりますか?
それとも解凍ができないということ?
★デスクトップにダウンロードして開くと、解答しようとすると、テキストファイル処理の確認がでてきて、・・・・・・・zip.bakの形式になり、デスクトップにもうひとつファイルができます。

ご丁寧にありがとうございます。
よろしくお願いします。

補足日時:2011/09/08 11:59
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qphpでzipファイルダウンロード後の削除について

phpでzipファイルダウンロード後の削除について

phpにおいて、ボタンをクリックしたときに、サーバ内の
ディレクトリの中身をzip圧縮してダウンロードを行う処理を
作成し、ダウンロード後はサーバ内のzipファイルを
削除したいと考え、下記のような流れでプログラムを作成しました。

//1.zipファイルの作成
shell_exec("zip -r file.zip targetdir");

//2.HTMLヘッダ
Content-type ・・・

//3.readfileでファイル読み込み
readfile(file.zip);

//4.ファイル削除
shell_exec("rm -f file.zip");

3.までは上手く動作して、意図したzipファイルを
ダウンロードできるのですが、
4.の動作が、3.でのダウンロードダイアログで
・「保存」してダウンロードすると動作して削除する。
・「キャンセル」してダウンロードせずダイアログを
閉じると削除されずサーバに残ってしまう。

となってしまいます。
ちなみに一旦「保存」を選択して、ダウンロード途中に
「キャンセル」を選択して中断しても削除されませんでした。

ダウンロードダイアログでの操作に関わらず作成した
zipファイルを削除したいのですが、どのようにすればいいか
わかりません。
shell_exec関数をunlinkなどに変えて見ても結果は同じでした。

アドバイスを頂ければと思い質問させていただきました。
よろしくお願いします。

phpでzipファイルダウンロード後の削除について

phpにおいて、ボタンをクリックしたときに、サーバ内の
ディレクトリの中身をzip圧縮してダウンロードを行う処理を
作成し、ダウンロード後はサーバ内のzipファイルを
削除したいと考え、下記のような流れでプログラムを作成しました。

//1.zipファイルの作成
shell_exec("zip -r file.zip targetdir");

//2.HTMLヘッダ
Content-type ・・・

//3.readfileでファイル読み込み
readfile(file.zip);

//4.ファイル削除
shell_exec("rm -f file.zip");

3...続きを読む

Aベストアンサー

いけますね。readfileではなく、freadで一旦変数に格納してファイル本体はすぐに削除。
それから出力すれば、ダウンロード完了でもキャンセルでも、ファイルは削除されていることになります。(ファイルサイズがあまりに大きすぎると厳しいかもしれませんが)

万一不明なときは補足してください。

Qで配列(複数の要素)を渡したいとき?

こんにちわ,

今HTML+PHPで
$hoge[]にいくつかの要素が入っているとき,
それをあるfoo.phpというページに渡したいとき,
echo '<form action="foo.php" method="POST">';
echo '<input type="hidden" name="$hoge[]" >';
echo '</form>';
としたのですが,うまくいきません。

どうしたらよろしいでしょうか。

Aベストアンサー

nameじゃなく、valueでは?
あとやるなら、
for($i=0;$i<count($hoge);$i++){
print "<input type=\"hidden\" name=\"$hoge[$i][0]\" value=\"$hoge[$i][1]\">";
}
とか?

Q複数ファイルを連続でダウンロード

はじめまして
複数ファイルのダウンロードについて質問します。

チェックボックスで複数のファイル(PDFファイル)を選択して
ダウンロードができるようにしたいのです。
自分でも色々調べて、「PEAR」モジュール「File_Archive」を使い
選択した複数ファイルを圧縮してダウンロードできるようにしました。

しかし、要望として圧縮ファイルにはせず、
PDFファイルを選択した数だけ順番にダウンロードできるようにしたいのです。

自分でも「header関数」を使いダウンロードできるようにソースを書いてみましたが
一つ目のファイルしかダウンロードできず、2つ目からのダウンロードが始まりません。

【ソースの例】***********************************
//DOWNLOAD1
$file_location="/mnt/bisei_nfs/test1.txt";
$filename="test1.txt";

/*ファイルダウンロード処理*/
$filesize=filesize($file_location);
header("Accept-Ranges:none");
header("Content-Length:$filesize");
header("Content-Disposition:filename=\"$filename\"");
header("Content-Type:text/octet-stream");//IE
$fp=fopen("$file_location","rb");
@fpassthru($fp);

//DOWNLOAD2
$file_location="/mnt/bisei_nfs/test2.txt";
$filename="test2.txt";

/*ファイルダウンロード処理*/
$filesize=filesize($file_location);
header("Accept-Ranges:none");
header("Content-Length:$filesize");
header("Content-Disposition:filename=\"$filename\"");
header("Content-Type:text/octet-stream");//IE
$fp=fopen("$file_location","rb");
@fpassthru($fp);
*****************************************************
順番にダウンロードするには、どうしたらよいのでしょうか?

はじめまして
複数ファイルのダウンロードについて質問します。

チェックボックスで複数のファイル(PDFファイル)を選択して
ダウンロードができるようにしたいのです。
自分でも色々調べて、「PEAR」モジュール「File_Archive」を使い
選択した複数ファイルを圧縮してダウンロードできるようにしました。

しかし、要望として圧縮ファイルにはせず、
PDFファイルを選択した数だけ順番にダウンロードできるようにしたいのです。

自分でも「header関数」を使いダウンロードできるようにソース...続きを読む

Aベストアンサー

サーバー側の処理では無理
javascriptで複数回要求をだせばよいと思います

Qob_end_clean と ob_clean の違いはなんですか?

ob_end_clean と ob_clean の違いはなんですか?
両方ともバッファ内容を削除するらしいですが、
ob_end_cleanは、バッファ自体も削除
ob_cleanは、バッファ自体は削除しないとあります。

バッファ自体とはどういう意味でしょうか?

Aベストアンサー

>バッファ自体とはどういう意味でしょうか?
この質問が出るということは、ob_XXXX系関数を利用するにあたっての基礎知識が不足してますね。

---------------------------------
第一に、ob_XXXX系関数こと、
出力制御関数(output control)について知識を習得しましょう。
参考URLに、マニュアルへのリンクを記載しておきます。
一読して知識を習得してください。

第二に、出力制御関数(output control)の使い方の基本を押さえましょう。
基本は、ob_start() と ob_end_XXXX() を組合せて使うことです。
 ・ob_start()で出力制御を開始。
 ・ob_end_XXXX()で出力制御を終了。
この、ob_start()とob_end_XXXX()は【必ず】対で利用しなければならないルールなので注意してください。
------------------------------------------

基礎知識については以上です。
さて、ここで質問にある
>ob_end_clean と ob_clean の違いはなんですか?
について考えましょう。

もう答えはお分かりだと思いますが、
ob_end_clean()関数は、ob_end_XXXX()の一種です。
つまり、
 ・ob_end_clean():ob_start()で開始した出力制御を終了する場合。
 ・ob_clean():出力制御を継続する場合。
というのが2者の違いになります。

参考URL:http://jp.php.net/manual/ja/ref.outcontrol.php

>バッファ自体とはどういう意味でしょうか?
この質問が出るということは、ob_XXXX系関数を利用するにあたっての基礎知識が不足してますね。

---------------------------------
第一に、ob_XXXX系関数こと、
出力制御関数(output control)について知識を習得しましょう。
参考URLに、マニュアルへのリンクを記載しておきます。
一読して知識を習得してください。

第二に、出力制御関数(output control)の使い方の基本を押さえましょう。
基本は、ob_start() と ob_end_XXXX() を組合せて使うことです...続きを読む

QPHPで複数ファイルをZIPで圧縮してダウンロードさせる処理を作りまし

PHPで複数ファイルをZIPで圧縮してダウンロードさせる処理を作りました。
色々とテストしてみると、ダウンロードして解凍しようとすると「未知の形式」となり解凍できない場合があります。
ファイル数の問題かと思いサイズが小さいファイルを5つ圧縮してダウンロードしてみると正常に解凍できました。
サイズが大きいファイルを4つ圧縮してダウンロードしてみると「未知の形式」になることがわかりました。

何かサーバー側で制限をかけているのでしょうか?
サーバーはApache2.2をローカルで使用しています。「zip.lib.php」を使用してプログラムを書きました。
ソースは以下のサイトのものをそのままコピーしました。
http://www.confrage.com/php/forward/download_comp/download_comp.html#list2

Aベストアンサー

大きいファイルを処理すると失敗する、という症状からすると、
圧縮処理に時間がかかりすぎてタイムアウトしている可能性が高いように思えます。

試しに、圧縮処理を始める前に
set_time_limit(0);
を入れたら改善されませんか?

http://phpspot.net/php/man/php/function.set-time-limit.html

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Qホームページでファイルをダウンロードさせる

お世話になります。
会社のホームページを制作中です。
マニュアルなどをアップしておき、ユーザーにダウンロードしてもらうページを作ろうと思っています。
<ベクターのような>
参考になる情報ありましたら教えてください。
宜しくお願いいたします。

Aベストアンサー

ダウンロードについて、
参考URLのページに分かりやすく書いてあるようです。
例もあるのでぜひ参考にしてください。

参考URL:http://www.tohoho-web.com/wwwxx013.htm

QPHPでファイルをダウンロードさせるコード

PDFファイルをその場では開かせず、ダウンロードさせるコードを作成しています

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($path_file) . '"');
header('Content-Length:' . $content_length);

ファイルをダウンロードさせること自体は成功しており、ファイル容量も間違ってないのですが
ダウンロード後に開こうとするとファイルが破損していて開くことができません。

また、ハイパーリンクから直接開かせた場合は問題なく表示できております。

原因の分かる方がいらっしゃいましたらアドバイスお願い致します。

Aベストアンサー

もしかして、PHPによる コードの自動変換が走っていて、
バイナリファイルであるPDFファイル中をコンバートしているのかも。
readfile()するまえに、
mb_http_output( "pass" ) ;
を入れてみては。

QリダイレクトでPOST

教えてください。

リダイレクトの際、POSTで次のページにデータを渡すことは可能でしょうか?

GETだと
header("Location: "a.php?no=".$no);
と、問題なくできるのですが、
できれば、パラメータを隠したいと思います。

以上ですが、よろしくお願いします。

Aベストアンサー

多分できないです。
それに、結局クライアント側に情報を送信しているのだから、POSTにしたところでパラメータを隠した事にはならないですし。
本当に隠すならサーバ側でセッション情報を引き継ぐような形にしないとダメでしょう。

AJAXのかたちにして、ページ遷移を見えなくするというのが手っ取り早いかも。

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?


人気Q&Aランキング