使用 php curl 将 *.gzip 文件上传到 api url

upload a *.gzip file to api url with php curl

现在差不多两天了,试图将 *.gzip(或 *.gz)文件上传到 jet api。下面的代码上传了文件,但是 jet api 说“ 解析文件时出错:GZip header 中的幻数不正确。确保你传入的是 GZip 流。"

function getCurlValue($filename, $contentType, $postname){
   // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax
   // See: https://wiki.php.net/rfc/curl-file-upload
   if (function_exists('curl_file_create')) {
       return curl_file_create($filename, $contentType, $postname);
   }

   // Use the old style if using an older version of PHP
   $value = "@{$filename};filename=" . $postname;
   if ($contentType) {
       $value .= ';type=' . $contentType;
   }

   return $value;
}

function curl_upload_test($file, $remote_url){

$filename = 'gzip-test.gz';

$cfile = getCurlValue($filename, 'application/x-gzip', $filename);


$data = array('file' => $cfile, 'method' => 'PUT');

$ch = curl_init();
$options = array(   CURLOPT_URL => $remote_url,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_CUSTOMREQUEST => $data['method'],
                    CURLOPT_HTTPHEADER => array(
                                            'Accept:',
                                            'Expect:',
                                            'Content-Type: application/x-gzip',
                                            'x-ms-blob-type: blockblob'
                                        ),
                    CURLINFO_HEADER_OUT => true, //Request header
                    CURLOPT_HEADER => 0, //Return header
                    CURLOPT_SSL_VERIFYPEER => false,
                    CURLOPT_POST => true,
                    CURLOPT_POSTFIELDS => $data
            );

curl_setopt_array($ch, $options);
$result = curl_exec($ch);
$header_info = curl_getinfo($ch,CURLINFO_HEADER_OUT);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$body = substr($result, $header_size);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

return $httpcode;
}

我没有浏览他们的文档,而是找到了使用 C# 上传 *.gzip 文件的 jet api 示例代码。

    ///Url returned by GET /api/files/uploadToken 
    var url = "https://imupload.blob.core.windows.net/merchant-files/b21611714c8d4734a7686e86f7a8080d?sv=2014-02-14&sr=b&sig=05ssdgrshow383JVEmqk%2BDwrTlHqfEO16gApw%2BgK6%2F2k%3D&se=2014-12-02T17%3A13%3A16Z&sp=w";

   var request = WebRequest.CreateHttp(url);
   request.Method = "PUT";  
   request.Headers.Add("x-ms-blob-type:BlockBlob");

   using (var stream = File.OpenRead(@"C:\temp\test.json"))
   using(var zipped = new GZipStream(request.GetRequestStream(), CompressionMode.Compress))
   stream.CopyTo(zipped);

   request.GetResponse();   

非常感谢对此的任何帮助。

我认为您应该尝试使用实际的 PUT 方法而不是 POST(参见示例 here)。此外,我认为您的 $data(您传递给 CURLOPT_POSTFIELDS)必须包含 GZIP 文件的实际二进制数据:

$data = file_get_contents($filename);

而不是看起来很奇怪的数组。

如果这没有帮助,非常感谢 link 您正在使用的 API 文档。