Web システムに CSV エクスポートがあり、これをクライアントからクエリしようとしています。問題は一度もありませんでしたが、何らかの理由で、クライアントの 1 つで、返されたデータの本体の直前に余分な 4 文字が含まれており、どこから来たのかを理解できません!
HTTP/1.1 200 OK
Date: Mon, 17 Jun 2013 09:17:22 GMT
Server: Apache/2.2
Set-Cookie: username=xxx expires=Mon, 17-Jun-2013 11:17:22 GMT; path=/
Set-Cookie: password=xxx; expires=Mon, 17-Jun-2013 11:17:22 GMT; path=/
Content-Disposition: attachment; filename="xxx-Stock.csv"
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/csv
20b1
"code","dsc","cat","sub","whqc","qty"
..................
上記では、20b1 が私の体の前に進んでいます。同じ方法でファイルを手動でダウンロードしましたが、ファイルに表示されません。
The export code looks like:
header("Content-Disposition: attachment; filename=\"" . $file . "\"");
header("Content-type: text/csv");
$tmp["header"] = "\"code\",";
$tmp["header"].= "\"dsc\",";
$tmp["header"].= "\"cat\",";
$tmp["header"].= "\"sub\",";
$tmp["header"].= "\"whqc\",";
$tmp["header"].= "\"qty\"\n";
echo $tmp["header"];
for ($i = 1; $i <= $data["count"]; $i++ ) {
$j = 1;
while ( isset($data[$i][$j]) ) {
$tmp["line"] = "\"" . str_replace("\"", "\"\"", $data[$i]["code"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i]["full_name"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i]["prstkcat"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i]["prsubcat"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i][$j]["whqc"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i][$j]["qty"]) . "\"\n";
echo $tmp["line"];
$j++;
}
}
奇妙なことは、私の他のクライアントでは起こらないことです。そのため、このクライアントからのデータに何か奇妙なものがあるのではないかと考えています。の一部をコメントアウトすると、$tmp["line"]
表示されません。また、いずれかの行をコメントアウトすると、このコードが変更されます。
一体何がこのキャラクターをそこに入れているのでしょうか?!
更新: これは、サーバーがチャンク エンコーディングを返したときにのみ行われました。コードを次のように変更したところ、動作するようになりました (これは私の専門分野ではないので、説明が欲しいです!)。
header("Content-Disposition: attachment; filename=\"" . $file . "\"");
header("Content-type: text/csv");
$tmp["header"] = "\"code\",";
$tmp["header"].= "\"dsc\",";
$tmp["header"].= "\"cat\",";
$tmp["header"].= "\"sub\",";
$tmp["header"].= "\"whqc\",";
$tmp["header"].= "\"qty\"\n";
$tmp["line"] = "";
for ($i = 1; $i <= $data["count"]; $i++ ) {
$j = 1;
while ( isset($data[$i][$j]) ) {
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i]["code"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i]["full_name"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i]["prstkcat"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i]["prsubcat"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i][$j]["whqc"]) . "\",";
$tmp["line"].= "\"" . str_replace("\"", "\"\"", $data[$i][$j]["qty"]) . "\"\n";
$j++;
}
}
header("Content-Length: " . strlen($tmp["header"] . $tmp["line"]));
echo $tmp["header"] . $tmp["line"];