c# - 如何正确编码二进制数据以通过 REST api PUT 调用发送

标签 c# rest azure http put

我试图简单地将图像文件上传到 Azure blob 存储,该文件正在那里,但文件大小大于应有的大小,当我通过浏览器下载文件时,它不会作为图片。

我通过 Azure 界面手动上传相同的文件,该文件可以正常工作,大小为 22k,通过我的代码上传为 29k,无法正常工作。

注意:需要注意的一件事是,此代码使用的所有示例仅发送文本文件。也许 Encoding.UTF8.GetBytes(requestBody);线正在做什么?

这是我对数据进行 Base64 编码的地方

HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase
byte[] binData;
using (BinaryReader b = new BinaryReader(hpf.InputStream))
    binData = b.ReadBytes(hpf.ContentLength);

var result = System.Convert.ToBase64String(binData);
new BlobHelper("STORENAMEHERE", "SECRETKEY").PutBlob("images", "test.jpg", result);

这就是我用来放置数据的东西,它来自 https://azurestoragesamples.codeplex.com/

public bool PutBlob(string container, string blob, string content)
{
    return Retry<bool>(delegate()
    {
        HttpWebResponse response;

        try
        {
            SortedList<string, string> headers = new SortedList<string, string>();
            headers.Add("x-ms-blob-type", "BlockBlob");

            response = CreateRESTRequest("PUT", container + "/" + blob, content, headers).GetResponse() as HttpWebResponse;
            response.Close();
            return true;
        }
        catch (WebException ex)
        {
            if (ex.Status == WebExceptionStatus.ProtocolError &&
                ex.Response != null &&
                (int)(ex.Response as HttpWebResponse).StatusCode == 409)
                return false;

            throw;
        }
    });
}

public HttpWebRequest CreateRESTRequest(string method, string resource, string requestBody = null, SortedList<string, string> headers = null,
    string ifMatch = "", string md5 = "")
{
    byte[] byteArray = null;
    DateTime now = DateTime.UtcNow;
    string uri = Endpoint + resource;

    HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
    request.Method = method;
    request.ContentLength = 0;
    request.Headers.Add("x-ms-date", now.ToString("R", System.Globalization.CultureInfo.InvariantCulture));
    request.Headers.Add("x-ms-version", "2009-09-19");

    if (headers != null)
    {
        foreach (KeyValuePair<string, string> header in headers)
            request.Headers.Add(header.Key, header.Value);
    }

    if (!String.IsNullOrEmpty(requestBody))
    {
        request.Headers.Add("Accept-Charset", "UTF-8");

        byteArray = Encoding.UTF8.GetBytes(requestBody);
        request.ContentLength = byteArray.Length;
    }

    request.Headers.Add("Authorization", AuthorizationHeader(method, now, request, ifMatch, md5));

    if (!String.IsNullOrEmpty(requestBody))
        request.GetRequestStream().Write(byteArray, 0, byteArray.Length);

    return request;
}

最佳答案

我认为问题在于如何将二进制数据转换为字符串,然后将其转换回字节数组。

在将二进制数据转换为字符串时,您使用的是System.Convert.ToBase64String,但是在从字符串获取字节数组时,您正在使用Encoding.UTF8.GetBytes 。这很可能导致不匹配。

请更改以下代码行:

byteArray = Encoding.UTF8.GetBytes(requestBody);

byteArray = System.Convert.FromBase64String(requestBody);

这应该可以解决问题。

关于c# - 如何正确编码二进制数据以通过 REST api PUT 调用发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45523971/

相关文章:

c# - 如何根据 Culture Info 获取日期和时间格式?

java - 带有无效XML的Spring请求正文问题

java - 创建 JAX-RS 提供程序以从 InputStream 创建 Java Image

entity-framework - 如何通过 Windows Azure(预览版)管理门户设置 ADO.NET Entity Framework 连接字符串?

c# - 如何从 .net 错误对话框发送错误报告?

c# - 为什么我的 WPF menuItem 图标不显示?

c# - 在 C# 中使用正则表达式匹配复数

Rest Assured API 测试 - 将 Json 对象作为参数传递给获取请求

Azure Redis 缓存与 Azure 上的 Redis 云服务

json - 内置 Azure 策略定义