Я создал форму для загрузки файлов в Google Cloud Storage с использованием XML-API POST Object.
Это работает нормально, за исключением файлов, размер которых превышает 50 КБ.Я тестировал на 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);
});
});
});
});
Это конечная точка / экспериментальная / загрузка / подписанная-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 КБ я получаю 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>
Есть ли кто-нибудь, кто может помочь мне загрузить более 50 КБ с этим?