使用PHP CURL将包含TAR的文件上载到REST PUT API,而不提取

使用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个字节开始

基本上,我面临以下问题:

我有一个大尺寸(4GB)的焦油容器(无压缩)。此TAR包含几个文件:

  • 文件1
  • 文件2
  • 文件3-我需要的文件(也是非常大的3 GB)
  • 其他文件(不管有多少)
我应该提到,我确实知道文件3从哪里开始(开始索引)以及它有多大(文件长度),因为TAR格式比较容易解析

我需要做的是通过使用PHP Curl将文件3上传到REST API。API端点是HTTP PUT,并且正确设置了头文件(如果我上传整个TAR文件,它会工作)

所以,infle=焦油容器。 文件3从第X个字节开始,长度为Y个字节。我已经知道X和Y的值了。 我需要旋度来开始从X到Y发送数据

到目前为止,我所做的是:

 $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的字符串,我才意识到回调函数被调用。美好的