我可以使用以下表单提交直接上传到谷歌云存储(在使用 Nodejs 获得签名 URL 之后)
<form action="https://<%=fields.bucket%>.storage.googleapis.com" method="post" enctype="multipart/form-data">
<input type="hidden" name="key" value="<%=fields.key%>">
<input type="hidden" name="bucket" value="<%=fields.bucket%>">
<input type="hidden" name="GoogleAccessId" value="<%=fields.GoogleAccessId%>">
<input type="hidden" name="policy" value="<%=fields.policy%>">
<input type="hidden" name="signature" value="<%=fields.signature%>">
<input type="hidden" name="Content-Type" value="<%=fields['Content-Type']%>">
<input name="file" type="file">
<input type="submit" onclick="myFunction(event)" value="Upload">
</form>
但是当使用以下方法使用 dropzone 时,我收到 400 错误。我成功获得了我的签名 URL,并且没有任何问题。问题在于 axios post 方法。
uploadOptions: {
url: "/",
uploadMultiple: false,
method: "PUT",
parallelUploads: 1,
headers: {
"Content-Type": "multipart/form-data"
},
autoProcessQueue: false,
autoDiscover: false,
acceptedFiles: "image/*",
maxFilesize: 5,
maxFiles: 10,
clickable: "#upload",
addRemoveLinks: true,
preventDuplicates: true,
dictDuplicateFile: "Duplicate Files Cannot Be Uploaded",
previewsContainer: ".dropzone-previews",
dictDefaultMessage: "",
thumbnailWidth: 200,
accept: function(file, done) {
var self = this;
var FileSize = file.size;
console.log(" In accept");
k1Object.$axios
.$get("my-board?operation=fileUpload&name=" + file.name)
.then(function(gcmData) {
let postData = gcmData[1];
let actionURL =
"https://" + postData.bucket + ".storage.googleapis.com";
file.uploadURL = actionURL;
k1Object.k1FormData = gcmData[1];
done();
setTimeout(function() {
self.processFile(file);
}, 0)
});
},
init: function() {
var self = this;
this.on("processing", function(file) {
self.options.url = file.uploadURL;
console.log("processing");
});
this.on("sending", function(file, xhr, formData) {
console.log(k1Object.k1FormData.key)
formData.append("key", k1Object.k1FormData.key);
formData.append("bucket", k1Object.k1FormData.bucket);
formData.append("GoogleAccessId", k1Object.k1FormData.GoogleAccessId);
formData.append("policy", k1Object.k1FormData.policy);
formData.append("signature", k1Object.k1FormData.signature);
formData.append("Content-Type", k1Object.k1FormData["Content-Type"]);
var _send = xhr.send;
xhr.send = function() {
_send.call(xhr, file);
};
});
}
}
400 错误
<?xml version='1.0' encoding='UTF-8'?><Error><Code>MissingSecurityHeader</Code><Message>Your request was missing a required header.</Message><Details>Authorization</Details></Error>
我不确定它期待什么字段,我什至为我的存储桶设置了 CORS 规则。谢谢你 。