0

在客户端应用程序Xamarin中,我想使用带有. 看来我不能使用最新的 WindowAzure.Storage nuget 包来做到这一点,因为它可能只适用于 Blob、Table ......并且它需要很多依赖项。SASPortable Class Library

有没有办法做到这一点?

4

1 回答 1

0

我最终使用了Azure File Storage REST API。基本上,我们首先请求从 Azure Share 生成的 SAS 令牌,然后在 URL 中使用该 SAS 令牌将 http 请求发送到 Azure 文件存储:

https://[yourshare].file.core.windows.net/[yourdirectory]/[yourfile]?[your_sas_token]

我创建了一个类来帮助客户端执行一些基本操作,如下所示(它是可移植类,因此可以在客户端的任何地方使用):

public class AzureFileREST
    {
        private AzureSASToken _azureShareToken;

        public AzureFileREST(AzureSASToken azureShareToken)
        {
            _azureShareToken = azureShareToken;
        }

        public async Task CreateIfNotExist(string directoryName)
        {
            var existed = await CheckDirectoryExists(directoryName);
            if (!existed)
            {
                await CreateDirectory(directoryName);
            }
        }

        public async Task<bool> CheckDirectoryExists(string directoryName)
        {
            using (var client = new HttpClient())
            {
                //Get directory (https://msdn.microsoft.com/en-us/library/azure/dn194272.aspx)
                var azureCreateDirUrl = _azureShareToken.Url + directoryName + _azureShareToken.SASToken + "&restype=directory";
                var response = await client.GetAsync(azureCreateDirUrl).ConfigureAwait(false);
                return (response.StatusCode != System.Net.HttpStatusCode.NotFound);
            }
        }

        public async Task CreateDirectory(string directoryName)
        {   
            using (var client = new HttpClient())
            {
                //Create directory (https://msdn.microsoft.com/en-us/library/azure/dn166993.aspx)
                var azureCreateDirUrl = _azureShareToken.Url + directoryName + _azureShareToken.SASToken + "&restype=directory";
                var response = await client.PutAsync(azureCreateDirUrl, null).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();
            }
        }

        public async Task UploadFile(string fileName, byte[] fileBytes)
        {
            using (var client = new HttpClient())
            {
                //Create empty file first (https://msdn.microsoft.com/en-us/library/azure/dn194271.aspx)
                var azureCreateFileUrl = _azureShareToken.Url + fileName + _azureShareToken.SASToken;
                client.DefaultRequestHeaders.Add("x-ms-type", "file");
                client.DefaultRequestHeaders.Add("x-ms-content-length", fileBytes.Length.ToString());
                var response = await client.PutAsync(azureCreateFileUrl, null).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();

                //Then upload file (https://msdn.microsoft.com/en-us/library/azure/dn194276.aspx)                
                var azureUploadFileUrl = azureCreateFileUrl + "&comp=range";
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Add("x-ms-write", "update");
                client.DefaultRequestHeaders.Add("x-ms-range", String.Format("bytes=0-{0}", (fileBytes.Length - 1).ToString()));

                var byteArrayContent = new ByteArrayContent(fileBytes);
                response = await client.PutAsync(azureUploadFileUrl, byteArrayContent).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();
            }
        }
    }

在服务器端,使用以下函数生成SAS令牌Share

public AzureSASToken GetSASFromShare(string shareName)
        {
            var share = _fileclient.GetShareReference(shareName);
            share.CreateIfNotExists();
            string policyName = "UPARSharePolicy";

            // Create a new shared access policy and define its constraints.
            var sharedPolicy = new SharedAccessFilePolicy()
            {
                SharedAccessExpiryTime = DateTime.UtcNow.AddDays(15),
                Permissions = SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write
            };

            // Get existing permissions for the share.
            var permissions = share.GetPermissions();

            // Add the shared access policy to the share's policies. 
            // Note that each policy must have a unique name.
            // Maximum 5 policies for each share!
            if (!permissions.SharedAccessPolicies.Keys.Contains(policyName))
            {
                if (permissions.SharedAccessPolicies.Count > 4)
                {
                    var lastAddedPolicyName = permissions.SharedAccessPolicies.Keys.Last();
                    permissions.SharedAccessPolicies.Remove(lastAddedPolicyName);
                }
                permissions.SharedAccessPolicies.Add(policyName, sharedPolicy);
                share.SetPermissions(permissions);
            }            

            var sasToken = share.GetSharedAccessSignature(sharedPolicy);
            //fileSasUri = new Uri(share.StorageUri.PrimaryUri.ToString() + sasToken);
            return new AzureSASToken ()
            {
               Name = shareName,
               Url = share.StorageUri.PrimaryUri.ToString() + "/",
               SASToken = sasToken        
            };
        }

最后使用这样的类:

var azureFileRest = new AzureFileREST(sasToken);
await azureFileRest.CreateIfNotExist(directoryName);
await azureFileRest.UploadFile(directoryName + "/" + fileName, bytes);
于 2016-09-01T15:27:58.480 回答