是否可以创建一个html表单,允许Web用户直接将文件上传到azure blob store,而不使用其他服务器作为中介?S3和GAW blob store都允许这样做,但我找不到对azure blob存储的任何支持。
既然Windows Azure存储服务支持CORS,您就可以这样做了。你可以在这里看到公告:Windows Azure存储发布版——引入CORS、JSON、分钟指标等。
我举了一个简单的例子来说明这种情况:http://www.contentmaster.com/azure/windows-azure-storage-cors/
该示例演示了如何使用jQuery直接从私有blob上传和下载。AJAX本例仍然需要一个服务器组件来生成共享访问签名:这避免了在客户端代码中公开存储帐户密钥的需要。
编辑十一月2019
您现在可以参考官方留档:
初步答案
有一个新的Azure存储JavaScript浏览器客户端库(预览版)。
(这篇文章的所有内容都来自上面的原始文章)
我们强烈建议使用SAS令牌通过Azure存储进行身份验证,因为JavaScript客户端库将向浏览器中的用户公开身份验证令牌。强烈建议使用范围和时间有限的SAS令牌。在理想的web应用程序中,预期后端应用程序将在用户登录时对其进行身份验证,然后向客户端提供SAS令牌,以授权访问存储帐户。这样就不需要使用帐户密钥进行身份验证。查看我们Github存储库中的Azure函数示例,它根据HTTP POST请求生成SAS令牌。
代码示例:
>
在超文本标记语言代码中插入以下脚本标记。确保JavaScript文件位于同一文件夹中。
<script src="azure-storage.common.js"></script/>
<script src="azure-storage.blob.js"></script/>
现在让我们向页面添加一些项目来启动传输。在BODY标签内添加以下标签。请注意,单击按钮时会调用上传BobFromText方法。我们将在下一步定义此方法。
<input type="text" id="text" name="text" value="Hello World!" />
<button id="upload-button" onclick="uploadBlobFromText()">Upload</button>
到目前为止,我们已经包含了客户端库,并添加了HTML代码,向用户显示文本输入和启动传输的按钮。当用户单击upload按钮时,将调用uploadBlobFromText。现在让我们来定义一下:
<script>
function uploadBlobFromText() {
// your account and SAS information
var sasKey ="....";
var blobUri = "http://<accountname>.blob.core.windows.net";
var blobService = AzureStorage.createBlobServiceWithSas(blobUri, sasKey).withFilter(new AzureStorage.ExponentialRetryPolicyFilter());
var text = document.getElementById('text');
var btn = document.getElementById("upload-button");
blobService.createBlockBlobFromText('mycontainer', 'myblob', text.value, function(error, result, response){
if (error) {
alert('Upload filed, open browser console for more detailed info.');
console.log(error);
} else {
alert('Upload successfully!');
}
});
}
</script>
请看一下这些博客文章,将文件直接从浏览器上传到blob存储:
http://coderead.wordpress.com/2012/11/21/uploading-files-directly-to-blob-storage-from-the-browser/
http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript
第二篇文章(我写的)使用了HTML5文件API,因此不能在所有浏览器中使用。
基本思想是为blob容器创建共享访问签名(SAS)
。SAS应具有写入
权限。由于Windows Azure Blob存储尚不支持CORS(Amazon S3和谷歌都支持CORS),因此您需要在Blob存储中托管HTML页面,以便用户上传文件。然后可以使用jQuery的Ajax功能。
问题内容: 是否可以使用ajax将文件从浏览器升级到FTP服务器? 问题答案: 不会。浏览器不提供允许从JavaScript写入FTP的API。 您可以将文件发布到HTTP端点,然后使用服务器端代码将其推送到FTP服务器。
问题内容: 我是一名javascript / java开发人员,我一直在尝试弄清楚seleniumwebdriver自动化框架如何从文件系统上载文件。无法设置通过javascript输入的文件,因为它违反了安全性。但是,webdriver可以通过以下命令执行此操作: 因此,他们通过发送密钥来设置值吗?我不明白 我浏览了以下源代码:http : //code.google.com/p/seleniu
我们目前有一个小的web应用程序,其中一部分是文件上传。目前,我们在客户端上使用Plupload,并启用了分块功能,以允许上传大型文件。这些文件被保存在应用服务器上,当它们出现时,这些块被追加。 现在,我们正在使用AmazonS3来存储文件,并有可能使用多个应用服务器。我发现很难处理这些大块。我试着以他们为榜样,但我遇到了问题。我尝试的主要内容是这样的: 我的问题是我需要知道上传的块。当我从上传的
问题内容: 我正在使用REST API通过REST API实现从客户端计算机到AmazonS3的直接文件上传,而没有任何服务器端代码。一切正常,但有一件事让我担心。 当我向Amazon S3 RESTAPI发送请求时,我需要对请求进行签名并将签名放入标头中。要创建签名,我必须使用我的密钥。但是所有事情都是在客户端发生的,因此,可以很容易地从页面源中揭示密钥(即使我混淆/加密了源)。 我该如何处理?
替代解决方案使用powershell直接上传到azure Blob。拥有一个特定的目录就像一个队列,放置在其中的任何文件都将从文件服务器上传到azure blob。然后后台工作将从那里做它需要做的事情...
我试过XMLHttpRequest的PUT请求。有一个浏览器端的限制,不允许我上传大于2GB的文件。然后我尝试了一个不需要Javascript端预处理的超文本标记语言表单的POST请求。它在一次操作中有5GB的上传大小限制。 AWS建议在较大的上传场景中进行多部分上传。这需要将文件分成小块,然后上传成小块。当文件大小大于10GB时,如何从浏览器中正确地执行此操作。