google-cloud-platform - 无法使用 Google Cloud Storage POST Object XML API 上传超过 50KB
问题描述
我创建了一个表单,用于使用 POST Object XML API 将文件上传到 Google Cloud Storage。
除了超过 50KB 的文件外,这工作正常。我已经在 Google Chrome 和 Firefox 上进行了测试。
这是HTML
<form id="upload-form"
method="POST"
role="search">
<div class="form-group">
<label class="col-sm-2 control-label">File input</label>
<div class="col-sm-10">
<input type="file" class="filestyle"
name="file">
</div>
</div>
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button type="submit" class="btn btn-primary">Upload</button>
</div>
</div>
</form>
这是JavaScript
$(function () {
$('#upload-form').submit(function (e) {
e.preventDefault();
$.post("/experimental/upload/signed-url").then(function (info) {
var form = $('#upload-form')[0];
var formData = new FormData(form);
formData.append('googleAccessId', info.googleAccessId);
formData.append('policy', info.policy);
formData.append('signature', info.signature);
formData.append('bucket', info.bucket);
formData.append('key', info.key);
formData.append('success_action_status', info.successActionStatus);
$.ajax({
url: info.url,
data: formData,
type: 'POST',
contentType: false,
processData: false,
}).then(function (res2) {
console.log(res2);
});
});
});
});
这个端点 /experimental/upload/signed-url 创建像这样的响应
{
"googleAccessId" : "xxxx",
"policy" : "REDACTED",
"signature" : "REDACTED",
"successActionStatus" : "201",
"url" : "https://storage.googleapis.com/my-bucket",
"bucket" : "my-bucket",
"key" : "path/file-name",
"clientName" : null,
"publicUrl" : "https://storage.googleapis.com/my-bucket/path/file-name"
}
创建签名的代码如下所示
try {
byte[] policy = policyDocument.toJsonBytes();
System.out.println(policyDocument.toJson());
String encodedPolicy = BaseEncoding.base64().encode(policy);
ServiceAccountCredentials cred = ServiceAccountCredentials
.fromStream(new FileInputStream(googleCredentialsFile));
byte[] signatureBytes = cred.sign(encodedPolicy.getBytes(Charsets.UTF_8));
String signature = BaseEncoding.base64().encode(signatureBytes);
info.setGoogleAccessId(cred.getAccount());
info.setPolicy(encodedPolicy);
info.setSignature(signature);
info.setSuccessActionStatus(STATUS_CODE);
info.setUrl(String.format(END_POINT_URL_FORMAT, info.getBucket()));
return info;
} catch (IOException e) {
throw new RuntimeException(e);
}
这是政策文件的样子
{
"conditions": [
{
"success_action_status": "201"
},
{
"bucket": "XXXXX"
},
{
"key": "path/file-name"
},
[
"content-length-range",
0,
1895825408
]
],
"expiration": "2018-06-13T12:51:45.143+03:00"
}
对于超过 50 KB 的文件,我使用此正文获得 HTTP 状态 400
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidArgument</Code>
<Message>Invalid argument.</Message>
<Details>Cannot create buckets using a POST.</Details>
</Error>
有没有人可以帮我上传超过 50KB 的文件?
解决方案
我支持 GCP 支持。我们能够使用基于此文档的 POST 请求获得相同的错误消息,而与文件大小无关。
"url" : "https://storage.googleapis.com/my-bucket",
一旦我们通过添加对象更改等效项,它就得到了修复:"url" : "https://storage.googleapis.com/my-bucket/my-file.ext",
然后使用POST
我们不断收到一些错误消息,所以我们将方法更改为PUT
. 然后它起作用了。
不工作的卷曲请求:
curl -d @[FILENAME.EXT] @[JSONFILE.json] -X POST -H 'Authorization: Bearer [TOKEN]' http://[BUCKET_NAME].storage.googleapis.com/
工作卷曲请求:
curl -v H 'Authorization: Bearer [TOKEN]' -F upload=@[FILENAME.EXT] -X PUT http://[BUCKET_NAME].storage.googleapis.com/[FILENAME.EXT]
我还要求根据经验教训改进文档。
推荐阅读
- state - 无限状态自动机
- c - 将 uint64_t 分解为 uint8_t 数组 - C
- python - 如何从字符串文字构建字符串对象?
- ag-grid - 如何在 ag 网格中更新服务器端行模型类型中的行/设置行数据?
- docker-compose - Docker-compose 卷映射到外部 USB 驱动器
- python - CUDA GPU processing: TypeError: compile_kernel() got an unexpected keyword argument 'boundscheck'
- python - 如何使用包含列表中值的字典扩展 pydatable 的列?
- java - 从文件中读取数组元素时出现 NullPointerException 错误 - Java
- android - 如何将 Firebase 中的图像检索到我的 android 应用程序中?
- mongodb - 在 docker 容器中运行 mongo