如何在Java中为给定的SAS URI上传文件

时间:2016-07-12 17:28:40

标签: java c# azure azure-storage azure-storage-blobs

示例C#代码:

 static void UploadFile(string sasUrl, string filepath)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("x-ms-version", Version);
            client.DefaultRequestHeaders.Add("x-ms-client-request-id", SessionGuid);

            StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?><BlockList>");

            foreach (byte[] chunk in GetFileChunks(filepath))
            {
                var blockid = GetHash(chunk);
                HttpRequestMessage chunkMessage = new HttpRequestMessage()
                {
                    Method = HttpMethod.Put,
                    RequestUri = new Uri(sasUrl + "&timeout=90&comp=block&blockid=" + WebUtility.UrlEncode(blockid)),
                    Content = new ByteArrayContent(chunk)
                };
                chunkMessage.Headers.Add("x-ms-blob-type", "BlockBlob");
                chunkMessage.Content.Headers.Add("MD5-Content", blockid);

                TimeAction("Uploading chunk " + blockid + " took {0} ms", () =>
                {
                    var response = client.SendAsync(chunkMessage).Result;
                });
                sb.Append("<Latest>");
                sb.Append(blockid);
                sb.Append("</Latest>");
            }
            sb.Append("</BlockList>");

            Trace.WriteLine(sb.ToString());

            HttpRequestMessage commitMessage = new HttpRequestMessage()
            {
                Method = HttpMethod.Put,
                RequestUri = new Uri(sasUrl + "&timeout=90&comp=blocklist"),
                Content = new StringContent(sb.ToString())
            };
            TimeAction("Commiting the blocks took {0} ms", () =>
            {
                var commit = client.SendAsync(commitMessage).Result;
            });
        }
    }

我被困在我要上传文件的位置。还想知道在给定代码中提交的原因是什么?

到目前为止,我的进展是:

public static void uploadFile(String sasUrl , String filepath , String sessionGuid)
{
    File file = new File(filepath);
    FileInputStream fileInputStream=null;
    Response reply = new Response();
    HttpClient client = HttpClientBuilder.create().build();
    HttpPost request = new HttpPost(sasUrl);
    request.setHeader("x-ms-version", "2013-08-15");
    request.setHeader("x-ms-client-request-id", sessionGuid);
    StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?><BlockList>");


}
}

注意:我无法多次运行代码,因为我无法向服务器发送垃圾邮件。任何建议将不胜感激 参考:https://msdn.microsoft.com/en-us/library/windows/hardware/dn800660(v=vs.85).aspx

1 个答案:

答案 0 :(得分:2)

根据C#中的参考代码,它似乎使用REST API Put Block List将文件上传为块blob。

因此,您可以参考REST API参考,而无需参考C#示例来使用httpclient来构建上载请求。

但是,简单的方法是使用Azure Storage SDK for Java。要上传文件,您只需使用课程CloudBlockBlob上传包含upload(InputStream sourceStream, long length)函数的文件,请参阅教程https://azure.microsoft.com/en-us/documentation/articles/storage-java-how-to-use-blob-storage/#upload-a-blob-into-a-container

sas网址似乎是https://myaccount.blob.core.windows.net/mycontainer/myblob?comp=blocklist&...

以下是代码示例。

URL sasUrl = new URL("<sas-url>");
try
{.
    CloudBlockBlob blob = new CloudBlockBlob(sasUrl)
    File source = new File(filePath);
    blob.upload(new FileInputStream(source), source.length());
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

作为参考,请参阅javadocs以获取Azure Java Storage SDK。