【发布时间】:2018-10-25 05:12:12
【问题描述】:
我正在使用 SignedURL 将文件直接上传到 Cloud Storage,而无需通过 App Engine 实例。我正在遵循的过程是:
-
创建一个空对象并为该对象生成一个 SignedURL
Storage storage = null; try{ FileInputStream credentialsStream = new FileInputStream("JSONFile"); Credentials credentials = GoogleCredentials.fromStream(credentialsStream); storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService(); }catch(IOException e) { e.printStackTrace(); } Acl aclObject = Acl.of(User.ofAllUsers(),Role.OWNER); List<Acl> aclAccess = new ArrayList<>(); aclAccess.add(aclObject); //BucketName and User name are Strings. BlobId blobId = BlobId.of(BUCKET_NAME,USER_NAME+"TeamLogo"); BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setAcl(aclAccess).setContentType("image/jpeg").build(); Blob blob = storage.create(blobInfo);
至此,云存储中创建了一个空对象
我正在为此空对象生成一个签名URL,这样当用户上传文件时,文件的内容将替换空对象
HttpMethod httpMethod = HttpMethod.PUT;
ServiceAccountSigner signer = ServiceAccountCredentials.newBuilder().setClientId(CLIENT_ID).setClientEmail(CLIENT_EMAIL).setPrivateKey(PRIVATEKEY).setPrivateKeyId(PRIVATE_KEY_ID).build()
URL url = blob.signUrl(10,TimeUnit.MINUTES,Storage.SignUrlOption.httpMethod(httpMethod),Storage.SignUrlOption.signWith(signer),Storage.SignUrlOption.withContentType());
return url;
用于处理文件上传的 HTML 代码
<form action="${signedURL}" method="put" enctype="multipart/form-data">
<label>Enter Your User Name</label><br>
<input type="text" name="UserName" ><br><br>
<label>Enter Your Team Name</label><br>
<input type="text" name="TeamName" ><br><br>
<label>Upload Team Logo</label><br>
<input type="file" name="myFile" required="required"><br><br>
<input type="submit" value="Create Team">
<input type="hidden" name="success_action_redirect" value="http://localhost:8080/register">
</form>
选择文件并点击上传后,我选择的文件没有上传到云存储,它正在加载此页面(带有 URL 的白色页面)。
我没有达到我想要的结果。我的代码中缺少什么?云存储的 Java 文档并没有为像我这样的新手提供完整的图片。有人请在这方面帮助我。
更新:对云存储的 Javascript AJAX 请求
var signedURL;
function uploadFile(){
var urlxhr = new XMLHttpRequest();
//To get the SignedURL from server side
urlxhr.open('GET','http://localhost:8080/getsignedurl')
urlxhr.send();
urlxhr.onreadystatechange = function(){
if (urlxhr.readyState == 4 && urlxhr.status == 200) {
signedURL = urlxhr.responseText;
var file = document.getElementById("myFile").files[0]
var formData = new FormData();
formData.append('imageFile',file);
var storageXhr = new XMLHttpRequest();
storageXhr.open('PUT',signedURL,true);
storageXhr.onload = () => {
if(storageXhr.status == 200){
alert("File Successfully Uploaded");
}else{
alert("Something went Wrong");
}
};
storageXhr.onerror = () => {
alert("An Error occured while Uploading file");
};
storageXhr.setRequestHeader('Content-Type',file.type);
storageXhr.send(formData);
}
}
}
<!-- Uploading Directly to Cloud storage by AJAX Request -->
<form action="#" method="put" onsubmit="uploadFile()">
<label>Select Your Team Logo</label>
<input type="file" id="myFile" required="required">
<input type="submit" value="Upload File">
</form>
</div>
【问题讨论】:
标签: java google-app-engine google-cloud-platform google-cloud-storage