来自fopen的File_put_contents创建的文件不同于浏览器


file_put_contents from fopen creates different file than a browser

我快疯了。我可以通过浏览器从互联网下载一个文件,它的工作很好。但是,如果我使用PHP编写一个脚本来为我做这件事,那么文件最终会完全不同(根据在线diff工具)。

$link = "https://torcache.net/torrent/9AE1726935FF9C08DF422CCE3C4445FC9484478B.torrent?title=[kat.cr]the.big.bang.theory.s08e24.720p.hdtv.x264.dimension.rartv";
file_put_contents($file_name, fopen( $link, 'r'));

首先我试着玩编码,但这应该不重要,因为文件是二进制的,对吗?还尝试了file_get_contents而不是fopen,同样的问题。

我的PHP应用程序运行在UTF-8 w/o BOM文件。有人能帮忙吗?我做错了什么?

我想我明白你的意思了。来自torcache.net的响应都被gzip压缩。如果您从浏览器下载该文件,该文件将被自动解码,但如果您对php执行相同的操作,您将获得相同的文件,但仍然编码。你可以使用gzdecode来解码。
file_put_contents($file_name, gzdecode(file_get_contents($link)));

您的代码中有一些错误。

首先尝试将字符串添加到没有括号的变量中。

$link = "https://torcache.net/torrent/9AE1726935FF9C08DF422CCE3C4445FC9484478B.torrent?title=[kat.cr]the.big.bang.theory.s08e24.720p.hdtv.x264.dimension.rartv"

下次您尝试通过https下载该文件。检查openssl是否启用,php.ini

中的allow_url_fopen设置是否正确https://secure.php.net/manual/en/features.remote-files.php

有三种方法可以解决你的问题:

  1. 为https调用启用openssl

  2. 使用curl将ssl验证设置为0

  3. 将https替换为http,可以正常通话

选项3是最简单的。