使用 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 文档。
现在差不多两天了,试图将 *.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 文档。