代码之家  ›  专栏  ›  技术社区  ›  datasn.io

用PHP提供数字产品下载的最佳方式是什么?

  •  3
  • datasn.io  · 技术社区  · 16 年前

    客户为下载链接付费的数字商业产品。

    我将所有压缩文件(产品)放在web文档根目录之外,买家通过与paypal IPN集成的php脚本下载它们,以确保下载者是付费买家。

    有点像: http://www.mysite.com/download.php?buyer_id=xxx

    到目前为止,这一切只适用于一个问题。我通过上面的URL下载的zip文件已损坏,无法使用WinRAR正确打开。不过,直接下载zip也可以。

    我的代码:

    $path = WAREHOUSE_PATH.'/products/'.$identifier.'.zip';
    $mm_type="application/octet-stream";
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Type: " . $mm_type);
    header("Content-Length: " .(string)(filesize($path)) );
    header('Content-Disposition: attachment; filename="'.basename($path).'"');
    header("Content-Transfer-Encoding: binary\n");
    
    $fp = @fopen($path,"rb");
    if ($fp) {
      while(!feof($fp)) {
        print(fread($fp, 1024*8));
        flush();
        if (connection_status()!=0) {
          @fclose($fp);
          die();
        }
      }
      @fclose($fp);
    }
    

    有什么不对劲吗?谢谢

    问题解决:谢谢大家的提示。事实证明,下载的软件包中包含了一些额外的空格,而这些空格本不应该存在。愚蠢的

    3 回复  |  直到 16 年前
        1
  •  3
  •   UnkwnTech    16 年前

    我建议改变这一点:

    $fp = @fopen($path,"rb");
    if ($fp) {
      while(!feof($fp)) {
        print(fread($fp, 1024*8));
        flush();
        if (connection_status()!=0) {
          @fclose($fp);
          die();
        }
      }
      @fclose($fp);
    }
    

    对此

    readfile($path);
    

    您可以在readfile上找到更多信息 here ,但基本上它将完成循环所做的一切。

        2
  •  2
  •   Greg    16 年前

    你最好还是用它 readfile()

    如果仍然存在问题,请在十六进制编辑器中加载文件,并比较前几个字符和后几个字符。

        3
  •  2
  •   David Grant    16 年前

    您的内容传输编码头有一个额外的换行符-这可能导致最后一个头和正文之间有三个换行符?

    推荐文章