如何通过PHP直接调用Azure Storage REST API上传Blob至容器?
PHP直接调用Azure Storage REST API上传PDF到Blob存储
以下是一个可行的示例,直接通过PHP调用Azure Blob Storage的REST API上传PDF文件,使用Shared Key进行身份验证:
前置准备
确保你有以下信息:
- Azure存储账户名称
- 存储账户访问密钥(主密钥或辅密钥)
- 目标Blob容器名称(需提前创建)
- 要上传的本地PDF文件路径
完整代码示例
<?php // 配置信息 $storageAccount = "your-storage-account-name"; $accountKey = "your-storage-account-key"; $containerName = "your-container-name"; $localFilePath = "/path/to/your/file.pdf"; $blobName = "uploaded-file.pdf"; // Blob存储中的文件名 // 读取文件内容和大小 $fileContent = file_get_contents($localFilePath); $fileSize = filesize($localFilePath); if ($fileContent === false) { die("无法读取本地PDF文件"); } // 构造请求URL $endpoint = "https://{$storageAccount}.blob.core.windows.net/{$containerName}/{$blobName}"; // 设置请求头 $currentDate = gmdate("D, d M Y H:i:s T"); $headers = [ "x-ms-date: {$currentDate}", "x-ms-version: 2020-08-04", // 使用支持的API版本,可按需调整 "x-ms-blob-type: BlockBlob", "Content-Type: application/pdf", "Content-Length: {$fileSize}" ]; // 构造签名字符串(严格遵循Azure签名规则,顺序不可错) $resource = "/{$storageAccount}/{$containerName}/{$blobName}"; $stringToSign = "PUT\n\n\n{$fileSize}\n\napplication/pdf\n\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-date:{$currentDate}\nx-ms-version:2020-08-04\n{$resource}"; // 生成Shared Key签名 $decodedKey = base64_decode($accountKey); $signature = base64_encode(hash_hmac("sha256", $stringToSign, $decodedKey, true)); $authorizationHeader = "SharedKey {$storageAccount}:{$signature}"; $headers[] = "Authorization: {$authorizationHeader}"; // 发送PUT请求 $ch = curl_init($endpoint); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS, $fileContent); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($httpCode === 201) { echo "PDF文件上传成功!"; } else { echo "上传失败,HTTP状态码:{$httpCode},响应内容:{$response}"; } curl_close($ch); ?>
关键说明
- Shared Key签名构造:
- 签名字符串必须严格按Azure规定的顺序拼接,空值字段需保留换行符
x-ms-version建议使用官方支持的最新版本,避免兼容性问题
- 请求头注意事项:
x-ms-blob-type必须设为BlockBlob,这是最通用的Blob存储类型Content-Type设置为application/pdf,确保Blob元数据正确识别文件类型
- 错误排查:
- 返回403错误通常是签名构造错误,检查签名字符串的顺序、日期格式、资源路径是否匹配
- 返回404错误需确认容器是否存在,或存储账户/容器名称拼写无误
内容的提问来源于stack exchange,提问作者Mike Talbot
相关产品推荐
相关产品推荐

