Softlayer对象存储ETag MD5校验和计算

时间:2016-01-25 21:28:44

标签: c# ibm-cloud-infrastructure

我正在试图弄清楚在将数据传递给Softlayer对象存储时如何计算正确的校验和。

我知道ETag是问题所在,因为如果我从请求中删除它就可以了,但是我更愿意使用它来验证上传是否已损坏。

这是我的方法:

    public bool SaveFile(byte[] file, eFetchStorageContainers container, string internalFileName, string fileName = "", bool overPublicNetwork = false)
    {
        Authenticate(overPublicNetwork);

        client = new RestClient(storage_url);
        var resourcePath = string.Format("/{0}/{1}", container, internalFileName);
        var req = new RestRequest(resourcePath, RestSharp.Method.PUT);

        req.AddHeader("X-Auth-Token", auth_token);
        req.AddFile(internalFileName, file, fileName);

        var md5Checksum = BitConverter.ToString(MD5.Create().ComputeHash(file)).Replace("-", string.Empty).ToLower();
        req.AddHeader("ETag", md5Checksum);

        var resp = client.Execute(req);

        return false;
    } 

以下是ETag的定义方式:

enter image description here

我认为问题在于我正在获取文件的校验和而不是请求正文。

  1. 我想验证我应该获取请求正文的校验和而不是文件。

  2. 如果以上情况属实,我甚至不确定如何获得身体的校验和 - 会喜欢一些指导......

2 个答案:

答案 0 :(得分:0)

好吧,我没有使用C#,但是对我来说使用curl很合适。我得到文件的校验和,它工作正常。 以防这里有一些关于这个https://community.runabove.com/kb/en/object-storage/how-to-check-file-consistency-using-etag-and-md5.html

的例子

确保您的请求与上述链接的示例类似。

这是我使用的卷曲:

curl -X PUT -T" C:\ Users \ ncabero \ Downloads \ picture.jpg" -H" X-Auth-Token:AUTH_XXXXXXX" -H" Etag:a43bf68dd35599a7873c12128f71b1f4" https://dal05.objectstorage.softlayer.net/v1/AUTH_d684780d-aafe-4772-bcbb-0f07d5f6edf3/rcvtest/picture.jpg

答案 1 :(得分:-1)

我实际上已经想到了这一点,我使用的是RestSharp,但它无法获得请求体。

我转移到HttpClient并能够访问请求正文以创建校验和。

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("X-Auth-Token", auth_token);
var bytes = new ByteArrayContent(file);
var formData = new MultipartFormDataContent();
formData.Add(bytes, internalFileName, internalFileName);

// this creates a checksum to send over for verification of non corrupted transfers
// this is also prevents us from using RestSharp due to its inability to create a checksum of the request body prior to sending
var md5Checksum = BitConverter.ToString(MD5.Create().ComputeHash(formData.ReadAsByteArrayAsync().Result)).Replace("-", string.Empty).ToLower();
httpClient.DefaultRequestHeaders.Add("ETag", md5Checksum);

var url = string.Format("{0}/{1}{2}/{3}", storage_url, containerName, folderId, internalFileName);
var resp = httpClient.PutAsync(url, formData).Result;

httpClient.Dispose();