1

嗨,我正在使用 PHP Web 服务上的函数 readfile() 将文件下载到 iOS 上的应用程序,我想知道文件是否正确下载,但我不知道该怎么做。

所以我正在尝试做一些回显以了解文件是否已像这样下载:

echo "before";
readfile($file);
echo "after";

但我得到的回应是这样的:

beforePK¿¿¿

任何人都知道这是什么意思,或者我怎么知道文件是否正确下载?

更新:是的,它是一个 zip 文件,这是我的标题

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$ticket");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
4

3 回答 3

1

您正在尝试输出 zip 文件的内容,不是吗?

readfile($file)echo file_get_contents($file). 如果您尝试向某人展示要下载的文件,请不要添加任何额外的输出,否则您可能会破坏文件。

我还建议阅读标题功能。这样你就可以明确地告诉浏览器你正在发送一个文件,而不是一个具有类似文件内容的 HTML 页面。(见涉及的例子Content-Type

于 2013-06-27T21:33:22.113 回答
0

PHP 应该在之前设置正确的标题readfile()- 这从字面上读取文件到浏览器/应用程序......但是浏览器/应用程序需要知道如何处理它......

于 2013-06-27T21:31:28.360 回答
0

通常你只是假设一旦连接关闭,数据就完成了传输。如果您想验证文件是否已完全传输,并且没有损坏,您需要使用 XML 或 JSON 之类的数据结构,这将:

  1. 分隔数据字段并导致 XML/JSON 解析器在省略一个错误时抛出错误,即传输在完成之前被切断。
  2. 允许您在响应中嵌入多条数据,例如。可以在客户端重新计算以验证数据是否完整的文件的 MD5 哈希。

例如:

$file = 'myfile.zip';

$my_data = array(
  'file' => base64_encode(file_get_contents($file)),
  'hash' => md5_file($file)
)

//header calls
header(...)

echo json_encode($my_data);
exit;
于 2013-06-27T22:46:42.720 回答