蓝心石 發表於 2019-11-13 18:12:00

php 下载图片并打包成Zip格式压缩包

<p><span style="font-size: 14pt">前言:最近公司有个需要下载多个图片并打包成压缩包的需求,下面来看看具体是怎么做的</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt">1、没什么说的,懒得说啥,直接看代码</span></p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 下载图片并生成压缩包
   * @param $data    图片数组,一维
   * @param $tmpDir 存放路径
   * @return string
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> downloadZipImg()
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$picAllArr</span> = ['http://www.dada.com/a.jpg','http://www.dada.com/b.jpg'<span style="color: rgba(0, 0, 0, 1)">];

      </span><span style="color: rgba(128, 0, 128, 1)">$tmpDir</span> = '这里是图片下载路径目录'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 类似于/www/public/upload/</span>

      <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 128, 128, 1)">file_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpDir</span><span style="color: rgba(0, 0, 0, 1)">)) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建文件夹</span>
            <span style="color: rgba(0, 128, 128, 1)">mkdir</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpDir</span>, 0777, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
      }

      </span><span style="color: rgba(128, 0, 128, 1)">$zipName</span> = <span style="color: rgba(0, 128, 128, 1)">date</span>('His') . <span style="color: rgba(0, 128, 128, 1)">mt_rand</span>(1000, 9999) . '.zip'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 压缩包文件名</span>
      <span style="color: rgba(128, 0, 128, 1)">$zipNameUrl</span> = <span style="color: rgba(128, 0, 128, 1)">$tmpDir</span> . <span style="color: rgba(128, 0, 128, 1)">$zipName</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 文件路径

      // 生成文件</span>
      <span style="color: rgba(128, 0, 128, 1)">$zip</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> \ZipArchive();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$zip</span>-&gt;open(<span style="color: rgba(128, 0, 128, 1)">$zipNameUrl</span>, \ZipArchive::OVERWRITE) !== <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">OVERWRITE 参数会覆写压缩包的文件 文件必须已经存在</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$zip</span>-&gt;open(<span style="color: rgba(128, 0, 128, 1)">$zipNameUrl</span>, \ZipArchive::CREATE) !== <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 文件不存在则生成一个新的文件 用CREATE打开文件会追加内容至zip</span>
                <span style="color: rgba(0, 0, 255, 1)">return</span>'下载失败,文件夹不存在'<span style="color: rgba(0, 0, 0, 1)">;
            }
      }

      </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$picAllArr</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断图片是否存在</span>
            <span style="color: rgba(128, 0, 128, 1)">$isFile</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkFileExists(<span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$isFile</span><span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(0, 0, 255, 1)">continue</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">抓取图片内容</span>
            <span style="color: rgba(128, 0, 128, 1)">$fileContent</span> = <span style="color: rgba(0, 128, 128, 1)">file_get_contents</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加图片</span>
            <span style="color: rgba(128, 0, 128, 1)">$zip</span>-&gt;addFromString(<span style="color: rgba(0, 128, 128, 1)">basename</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span>), <span style="color: rgba(128, 0, 128, 1)">$fileContent</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭</span>
      <span style="color: rgba(128, 0, 128, 1)">$zip</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">close();

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">没有文件</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 128, 128, 1)">file_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$zipNameUrl</span><span style="color: rgba(0, 0, 0, 1)">)) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> '下载失败,图片不存在或无法下载'<span style="color: rgba(0, 0, 0, 1)">;
      }

      </span><span style="color: rgba(0, 128, 128, 1)">header</span>("Cache-Control: public"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 128, 128, 1)">header</span>("Content-Description: File Transfer"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 128, 128, 1)">header</span>('Content-disposition: attachment; filename=' . <span style="color: rgba(128, 0, 128, 1)">$zipName</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">文件名</span>
      <span style="color: rgba(0, 128, 128, 1)">header</span>("Content-Type: application/zip"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">zip格式的</span>
      <span style="color: rgba(0, 128, 128, 1)">header</span>("Content-Transfer-Encoding: binary"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">告诉浏览器,这是二进制文件</span>
      <span style="color: rgba(0, 128, 128, 1)">header</span>('Content-Length: ' . <span style="color: rgba(0, 128, 128, 1)">filesize</span>(<span style="color: rgba(128, 0, 128, 1)">$zipNameUrl</span>)); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">告诉浏览器,文件大小

      // 下面2步必须要</span>
      <span style="color: rgba(0, 128, 128, 1)">ob_clean</span><span style="color: rgba(0, 0, 0, 1)">();
      </span><span style="color: rgba(0, 128, 128, 1)">flush</span><span style="color: rgba(0, 0, 0, 1)">();

      @</span><span style="color: rgba(0, 128, 128, 1)">readfile</span>(<span style="color: rgba(128, 0, 128, 1)">$zipNameUrl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 128, 128, 1)">unlink</span>(<span style="color: rgba(128, 0, 128, 1)">$zipNameUrl</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 删除文件</span>
      <span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">;
    }<br></span></pre>
</div>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 判断文件是否存在,支持本地及远程文件
   * @param String $file 文件路径
   * @return Boolean
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> checkFileExists(<span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 远程文件</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">strtolower</span>(<span style="color: rgba(0, 128, 128, 1)">substr</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span>, 0, 5)) == 'https'<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 远程文件</span>
            <span style="color: rgba(128, 0, 128, 1)">$header</span> = <span style="color: rgba(0, 128, 128, 1)">get_headers</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span>, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$header</span>) &amp;&amp; (<span style="color: rgba(0, 128, 128, 1)">strpos</span>(<span style="color: rgba(128, 0, 128, 1)">$header</span>, '200') || <span style="color: rgba(0, 128, 128, 1)">strpos</span>(<span style="color: rgba(128, 0, 128, 1)">$header</span>, '304'<span style="color: rgba(0, 0, 0, 1)">));

      } </span><span style="color: rgba(0, 0, 255, 1)">elseif</span> (<span style="color: rgba(0, 128, 128, 1)">strtolower</span>(<span style="color: rgba(0, 128, 128, 1)">substr</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span>, 0, 4)) == 'http'<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 远程文件</span>
            <span style="color: rgba(128, 0, 128, 1)">$header</span> = <span style="color: rgba(0, 128, 128, 1)">get_headers</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span>, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$header</span>) &amp;&amp; (<span style="color: rgba(0, 128, 128, 1)">strpos</span>(<span style="color: rgba(128, 0, 128, 1)">$header</span>, '200') || <span style="color: rgba(0, 128, 128, 1)">strpos</span>(<span style="color: rgba(128, 0, 128, 1)">$header</span>, '304'<span style="color: rgba(0, 0, 0, 1)">));
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 本地文件</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 128, 128, 1)">file_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$file</span><span style="color: rgba(0, 0, 0, 1)">);
      }
    }</span></pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 14pt">上面代码注释已经很清晰了,已经不需要在特殊说明了,这是亲测有效的代码,不然也不会拿出来,<span style="color: rgba(255, 0, 0, 1)"><strong>访问的时候,别用ajax来请求,因为浏览器不让ajax操作流文件,只能读,所以通过href地址栏的方式访问就能下载了</strong></span>。</span></p>
<p><span style="font-size: 18.6667px">具体原因如下:</span></p>
<p><span style="font-size: 18.6667px"><img src="https://img2018.cnblogs.com/blog/999593/201911/999593-20191113181249323-1381718579.png"></span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18.6667px"></span></p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt">以上就是本篇文章的全部内容了</span></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/chenhaoyu/p/11851580.html
頁: [1]
查看完整版本: php 下载图片并打包成Zip格式压缩包