我正在构建一个接口,它允许从服务器路径收集PDF文件,并立即下载压缩文件,这在大多数情况下都可以正常工作。现在,一些PDF文件不工作,意味着如果zip包含一个不工作的文件,整个下载将不会执行。

现在我尝试了许多不同大小的文件。我可以看出,大多数大于10MB的文件都不工作,但一个文件(15MB)正在工作,所以它不能是导致此错误的文件大小-对吗?

发生的是根本没有下载。此外,还尝试读取"$zip->addfile"和"$zip->close"的结果,但这都是正确的,即使不会执行下载。任何可能导致这个错误的想法,或者至少一些关于如何发现这个问题的提示?

过程中变量的(x)调试检查在工作时间和不工作时间之间没有区别。唯一的区别是文件大小和路径。

下面是我用来构建zip的代码:

public function downloadFiles() {

$myFiles = $this->Session->read('Files.MyFiles');

if(count($myFiles)) {

// build zip

$zipname = 'amaz_photos_' . time() . '.zip';

$zip = new ZipArchive();

$zip->open($zipname, ZipArchive::CREATE);

foreach($myFiles as $file) {

if($file['type'] == 'directory') {

$dirName = str_replace('/', '', substr($file['path'], strrpos($file['path'], '/'), (strlen($file['path']) - strrpos($file['path'], '/'))));

$zip->addEmptyDir($dirName);

$this->addFolderToZip($file['path'] . '/', $zip, $dirName . '/');

} else {

$zip->addFile($file['path'], str_replace('/', '', substr($file['path'], strrpos($file['path'], '/'), (strlen($file['path']) - strrpos($file['path'], '/')))));

}

}

$zip->close();

// get(send) zip

header('Content-Type: application/zip');

header('Content-disposition: attachment; filename=' . $zipname);

header('Content-Length: ' . filesize($zipname));

readfile($zipname);

ignore_user_abort(true);

unlink($zipname);

}

// clear"myFiles"

//$this->Session->write('Files.MyFiles', array());

$this->redirect(array(

'controller' => 'pages',

'action' => 'display'

));

}

毕竟,我尝试用包括Adobe原版在内的几个PDF阅读器打开受影响的文件,以确定它是否已损坏,但是?我?t?S?似乎没有。

这将发生在可打开的zip文件中,但下载不会以任何方式启动。我发现,在没有开始下载的特殊情况下,与工作时间相比,网络框架上没有设置响应头("application/zip")。

我还发现了:假设我有一个文件夹,里面有20个文件,但没有下载。我尝试选择文件1-10:下载,然后我尝试下载文件11-20:下载,然后我尝试下载文件1-20:不下载,然后我尝试了两次混合模式,首先是偶数文件2、4、6、8。(1-20),之后是奇数文件1、3、5、7、。(1-20):每个都没有下载。这说明错误不属于特定文件。

对于如何确定此错误的触发器有什么建议吗?

Update:

I was able to download the generated zip-file doing these steps:

Trigger 'create & download zip-file'

It creates a zip-file but not download it

Type the generated zip-files filename in the code to download it on the next procedure (e. g."$zipname ="generatedOnStep1.zip").

Trigger 'create & download zip-file' again

It does not download the (recently) generated file, but the file i generated in step 1. So it seems that: Generating Zip-Files is working AND downloading that same zip-File is working, but not at once and only in some unknown combinations.

Update 2:

Since I was not able to determine the issue nor fix it, I ended up redesigning the whole process, to redirect to the generated zip-file instead of"readfile" it. Some features had to be sourced out but anyways it works this way.

你试过检查压缩文件中PDF文件的大小吗?有尺码吗?与原始文件相比大小是多少?你也没有给我们addfoldertozip的代码。

在这种情况下,由于添加了单个文件,因此不使用addFolderToZip()。你只要记着跳过。不管怎样,你让我想到了下载后不要丢弃文件的想法。可以查看PDF,大小比未压缩的大2 MB。所以看起来一切正常,但下载没有开始。我有大的视频文件可以下载,所以我很确定它不是关于任何内存限制。此外,硬盘空间也相当空(足够)。

只是要清楚:zip是正确生成的,可以被拒绝,并且可以查看pdf。但是下载并不是从特定的PDF开始的。

这种情况发生的频率有多高,您是否尝试不删除生成的zip文件以查看zip文件中的实际内容,或者是否实际创建了这些文件?是否检查了PHP超时(运行时间限制或内存限制?)。如果没有下载,是否会得到一个空白页(可能表示有错误)?如果是这样,请检查php/webserver的错误日志。(btw,time()仅每秒唯一,请注意,如果同时执行两个请求,则可能会导致问题。也许可以试试tempnam)。

是的,我试着保存文件。这将发生在可打开的zip文件中,但下载不会以任何方式启动。我发现,在没有开始下载的特殊情况下,与工作时间相比,网络框架上没有设置响应头("application/zip")。日志是空的。

什么cakephp版本?

我通过重定向到zip文件而不是"readfile"来解决这个问题。这划分了许多逻辑,但按预期工作。

试试这个…取下readfile($zipname);,更换为:

/* make sure no other functions

holding this file */

$filehandle = fopen($zipname,"r");

while (!feof($filehandle)) {

/* lets read the file by pieces and

send it to user's browser */

echo fread($filehandle, 8192);

}

fclose($filehandle);

希望这有帮助。

它会导致同样的行为。如果我手动压缩,它会下载zip,如果我按ziparchive压缩,它会创建zip,但不会下载。这里发生了一些非确定性的奇迹……

即使你的回答没有解决我的问题,它也让我重新设计了流程,在创建zip后重定向到文件。谢谢你的产品。

谢谢。。。如果你解决了你的问题,请告诉我…我看到你的问题被更新了。我会根据你的最新情况进一步调查,并通知你。

php下载pdf文件不全,关于php:Zip PDF文件下载无效相关推荐

  1. wps linux 程序转pdf文件,将PowerPoint转换成PDF的九款免费软件(附下载)

    概述:PDF拥有许多可用的免费阅读器软件,因此在工作中,很多人会选择将PPT.PPTX文件转化为PDF.在这里,编者搜罗了九款能够将PPT转化为PDF格式的免费软件,它们的特性不尽相同,它们中的一些还 ...

  2. 如何减少PDF文件的大小,为pdf瘦身?

                         如何减少PDF文件的大小,为pdf瘦身? WORD转换成PDF后发现pdf挺大的,为了不改变pdf内容,且尽量不改变质量,使用Adobe Acrobat的&q ...

  3. shell换行合并多个文件_如何合并多个pdf文件?这里有合并PDF最简单的方法

    如何合并多个pdf文件?今天在整理一些PDF文件的时候,由于文件的数量比较多,我就想着将这些PDF文件合并起来,好在平时也了解了一些PDF合并的方法,很快就完成了文件的合并.想到应该还有很多朋友还不知 ...

  4. pdf文件怎么编辑,如何修改pdf文字

    如今下载或者是接收文档经常会碰到pdf这种格式的文档,对这种格式的文档一般也只是查看里面的内容就可以了,通过阅读器打开就可以,但是如果要对pdf文件编辑那该怎么办,阅读器是不可以编辑pdf文件的,只能 ...

  5. pdf文件怎么转化为word,pdf转换成word的方法

    如果收到一份PDF文件,但是不是自己想要的格式,需要将其转换成Word格式,有什么办法可以解决呢?在本文中,我们会告诉你pdf文件怎么转化为word,大家赶紧学起来吧. 方法一.使用Adobe Acr ...

  6. PDF文件解密方法是什么?PDF转换器有什么优点?

    在日常生活和工作中,PDF文件是比较常见的.例如许多商业合同使用PDF格式,这是因为PDF文件不仅具有内容丰富.段落清晰的优点,而且还具有安全.加密的优点.有时人们在互联网上下载的PDF文件是加密的, ...

  7. 如何将pdf转换成html,怎么把PDF文件转换成HTML?PDF转HTML的最佳方法是什么?

    原标题:怎么把PDF文件转换成HTML?PDF转HTML的最佳方法是什么? HTML是常见的网页格式.很多程序员在建站时为了省时省力往往直接在网上下载通用的HTML模板.HTML都是PDF格式文件,如 ...

  8. pdf文件怎么去除水印,pdf去除水印方法介绍

    pdf文件怎么去除水印?pdf文件是目前被普遍使用的一种文件格式,我们在工作中也会时常需要下载pdf文件进行使用,当我们遇到被添加了水印的pdf文件时,该如何将水印去除呢?如果屏幕前的你不知道的话就看 ...

  9. Python工具脚本,PDF文件批量转图片(pdf图片提取器)工具(exe)

    前面写(抄袭)了一下转图片(提取图片)的源码,包括PDF文件以及PPT文件,这里本渣渣抽空进行了exe打包,打包的是pdf文件转图片,当然使用的gui还是python的tkinter库,仅供参考和学习 ...

  10. pdf文件如何进行翻译?pdf文件翻译方法分享。

    pdf文件如何进行翻译?在日常的工作和学习当中,很多小伙伴都需要接受到pdf文件,需要我们对pdf文件进行翻译或者处理,那么众所周知dpf文件因为不可编辑性,从而变的特别特别的安全,深受大家的喜爱,那 ...

最新文章

  1. 电信、联通、移动、其它路由表 2011-06-19更新
  2. plt.xlabel 'str' object is not callable
  3. (1)51单片机NOP指令
  4. python补课费用_学习python阶段小总结
  5. Spark 编程模型(上)
  6. 线性汇编总结和函数说明
  7. P2495-[SDOI2011]消耗战【虚树,dp】
  8. Java中的中介器设计模式-示例教程
  9. vue如何过滤html标签,去除富文本中的html标签及vue、react、微信小顺序中的过滤器...
  10. 【LeetCode笔记】69. x 的平方根(Java、二分)
  11. java 地址传递 返回值_Java中的值传递和引用传递
  12. mysql 查看某数据库中所有表的行数,information_schema.tables不准确。count(*)拼接准确。
  13. JAVA基础系列:内部类获取外部类的成员变量
  14. php sql 字段不能为空值,关于php:Sudden SQL问题-一般错误:1364字段没有默认值
  15. [渝粤教育] 天津科技大学 人工智能导论 参考 资料
  16. 鸿蒙os会给小米用吗,国内手机厂商是否支持鸿蒙?中兴正式回应!小米的态度很意外!...
  17. 教你自定义收支类别,收支账户进行记账
  18. 【电源模块】TPS54331 DCDC降压芯片设计
  19. iOS 音乐播放器的实现
  20. 港科夜闻|香港科技大学校董会主席沈向洋院士一行到访香港科大(广州)

热门文章

  1. mysql 1146 错误处理
  2. ceph kernel rbd (二): rbd map , rbd unmap
  3. 【SVPWM】SVPWM算法推导及其Simulink仿真(一)
  4. python处理字符串(SQL语句批量新增)
  5. 简单并查集-加边的无向图
  6. 单片机双机通信c语言,单片机双机通信(C51程序)
  7. android 图片叠加xml,Drawable子类之——LayerDrawable (图层叠加)
  8. 【C语言】判断输入是否能被5整除
  9. 笔记本连接html后分成两个屏,一台电脑两个显示器是如何来实现 一台电脑两个显示器连接方法...
  10. win10计算机联接多个网络,如何设置win10电脑连接两个显示器?