我尝试使用Azure存储Rest API和Ajax直接从Web浏览器上传文件(实际上我正在使用Angular的$ http) 我没有成功地遵循所有可能的官方和自定义指南。
首先,我的CORS设置如下:
<script type="text/javascript">
$(function() {
$('#myForm').submit(function(e) {
e.preventDefault(); // stop form submission
$.ajax({
type: "POST",
url: "send-contact2.php",
data: $(this).serialize(),
cache: false,
success: function (data) {
alert(data);
}
});
}
});
</script>
在UI级别,我调用自己的API,返回SAS URL,如下所示:
var storageAccount = CloudStorageAccount.Parse(StorageConnectionString);
var blobClient = storageAccount.CreateCloudBlobClient();
var blobServiceProperties = blobClient.GetServiceProperties();
blobServiceProperties.Cors = new CorsProperties();
blobServiceProperties.Cors.CorsRules.Add(new CorsRule()
{
AllowedHeaders = new List<string>() { "*" },
AllowedMethods = CorsHttpMethods.Put | CorsHttpMethods.Get | CorsHttpMethods.Head | CorsHttpMethods.Post,
AllowedOrigins = new List<string>() { "*" },
ExposedHeaders = new List<string>() { "*" },
MaxAgeInSeconds = 1800 // 30 minutes
});
blobClient.SetServiceProperties(blobServiceProperties);
然后我使用此Angular模块上传blob:https://github.com/kinstephen/angular-azure-blob-upload
到目前为止一切顺利,但是当我尝试上传时,我会从OPTIONS请求中获取此信息(来自Chrome的“网络”标签):
403服务器无法验证请求。确保价值 正确形成授权标头,包括签名。
这来自控制台:
XMLHttpRequest无法加载'myAzureHttpLink / fotosrestaurantes / google.jpg?sv = 2015-04-05&amp; sr = b&amp; si = enviarFoto&amp; sig = ***&amp; se = 2016-01-11T14%3A16%3A22Z&amp; SP = W&安培;可比=块&安培;块标识= YmxvY2stMDAwMDAw 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许来源“http://localhost:34090” 访问。响应的HTTP状态代码为403。
现在,据我所知,从官方文档中可以理解(大部分内容都非常简洁,并且有很多链接几乎从不覆盖你真正需要的内容)如果我选择使用SAS URL我不需要授权标题。正如高拉夫在这里所说:https://stackoverflow.com/a/33846704/3198372
我尝试了所有东西,从容器SAS到blob SAS,但没有任何作用。好像CORS配置和SAS URL不起作用(即使它们在那里)。
任何人都知道我哪里错了?