使用PHP CURL将包含TAR的文件上载到REST PUT API,而不提取
基本上,我面临以下问题: 我有一个大尺寸(4GB)的焦油容器(无压缩)。此TAR包含几个文件:使用PHP CURL将包含TAR的文件上载到REST PUT API,而不提取,rest,put,php-curl,Rest,Put,Php Curl,基本上,我面临以下问题: 我有一个大尺寸(4GB)的焦油容器(无压缩)。此TAR包含几个文件: 文件1 文件2 文件3-我需要的文件(也是非常大的3 GB) 其他文件(不管有多少) 我应该提到,我确实知道文件3从哪里开始(开始索引)以及它有多大(文件长度),因为TAR格式比较容易解析 我需要做的是通过使用PHP Curl将文件3上传到REST API。API端点是HTTP PUT,并且正确设置了头文件(如果我上传整个TAR文件,它会工作) 所以,infle=焦油容器。 文件3从第X个字节开始
- 文件1
- 文件2
- 文件3-我需要的文件(也是非常大的3 GB)
- 其他文件(不管有多少)
$fileHandle = fopen($filePath, "rb"); //File path is the one of the TAR archive
fseek($fileHandle, $fileStartIndex, SEEK_CUR);
旋度的设置是
curl_setopt($curlHandle, CURLOPT_PUT, 1);
curl_setopt($curlHandle, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($curlHandle, CURLOPT_INFILE, $fileHandle);
curl_setopt($curlHandle, CURLOPT_INFILESIZE, $fileSize);
我必须提到,将文件3提取到磁盘目前不是一个选项,因为磁盘空间是任务的主要目的
我的第一个想法是查看CURLOPT_READFUNCTION,但是这个选项的回调应该返回一个字符串(在我的例子中是非常大的字符串:3 GB,它打破了PHP变量大小限制)
有人成功处理过这种上传吗?关于CURLOPT_READFUNCTION的任何其他提示和技巧也都值得欣赏
谢谢大家! 根据PHP curl:
CURLOPT_READFUNCTION接受三个参数的回调。这个 第一个是cURL资源,第二个是提供的流资源 要通过选项CURLOPT_infle进行卷曲,第三个选项是 要读取的最大数据量。回调必须返回一个字符串 长度等于或小于请求的数据量, 通常通过从传递的流资源中读取它。它应该 返回一个空字符串以发送EOF信号 因此,
CURLOPT_infle
为curl提供文件句柄,CURLOPT_inflesize
告诉curl最终文件有多大,以及CURLOPT_READFUNCTION
允许curl从文件中读取,这看起来应该满足您的需要
尽管curl将使用$length
参数调用您的CURLOPT_READFUNCTION
,但您可以根据以下规则自由返回所需内容:
回调必须返回长度等于或小于的字符串
请求的数据量
因此,如果返回的长度小于$length
,curl将继续调用CURLOPT_READFUNCTION
,直到它返回EOF
(一个空字符串)。因此,在读取CURLOPT_READFUNCTION
时,您需要跟踪文件中的位置,并从每次调用的上次读取位置开始。根据PHP curl:
CURLOPT_READFUNCTION接受三个参数的回调。这个 第一个是cURL资源,第二个是提供的流资源 要通过选项CURLOPT_infle进行卷曲,第三个选项是 要读取的最大数据量。回调必须返回一个字符串 长度等于或小于请求的数据量, 通常通过从传递的流资源中读取它。它应该 返回一个空字符串以发送EOF信号 因此,
CURLOPT_infle
为curl提供文件句柄,CURLOPT_inflesize
告诉curl最终文件有多大,以及CURLOPT_READFUNCTION
允许curl从文件中读取,这看起来应该满足您的需要
尽管curl将使用$length
参数调用您的CURLOPT_READFUNCTION
,但您可以根据以下规则自由返回所需内容:
回调必须返回长度等于或小于的字符串
请求的数据量
因此,如果返回的长度小于
$length
,curl将继续调用CURLOPT_READFUNCTION
,直到它返回EOF
(一个空字符串)。因此,在读取CURLOPT\u READFUNCTION
时,您需要跟踪您在文件中的位置,并从每次调用的上次读取位置开始。curl\u setopt($curlHandle,CURLOPT\u infle,$fileHandle)现在有什么问题代码>方法?假设我的Curl只需要从文件的索引X到索引Y发送字节,其中X不同于0,Y不同于文件的结尾。不知何故,我不知道如何控制这种行为。curl\u setopt($curlHandle,CURLOPT\u infle,$fileHandle)现在有什么问题代码>方法?假设我的Curl只需要从文件的索引X到索引Y发送字节,其中X不同于0,Y不同于文件的结尾。不知何故,我不知道如何控制这种行为。谢谢。直到返回该长度或EOF的字符串,我才意识到回调函数被调用。很好,谢谢。直到返回该长度或EOF的字符串,我才意识到回调函数被调用。美好的