Softlayer对象存储ETag MD5校验和计算
Softlayer Object Storage ETag MD5 Checksum Calculation
我正在尝试弄清楚在将数据传递到 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 的定义如下:
我认为问题在于我获取的是文件的校验和,而不是请求正文。
我想验证我应该得到请求正文的校验和,而不是单独的文件。
如果以上内容属实,我什至不确定如何获取主体的校验和 - 希望得到一些指导...
嗯,我没有使用 C#,但使用 curl 对我来说效果很好。我得到了文件的校验和并且工作正常。
以防万一这里有一些关于这个的例子 https://community.runabove.com/kb/en/object-storage/how-to-check-file-consistency-using-etag-and-md5.html
确保您的请求与上面 link 的示例相似。
这是我用的卷曲:
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
我真的想通了,我使用的是 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();
我正在尝试弄清楚在将数据传递到 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 的定义如下:
我认为问题在于我获取的是文件的校验和,而不是请求正文。
我想验证我应该得到请求正文的校验和,而不是单独的文件。
如果以上内容属实,我什至不确定如何获取主体的校验和 - 希望得到一些指导...
嗯,我没有使用 C#,但使用 curl 对我来说效果很好。我得到了文件的校验和并且工作正常。 以防万一这里有一些关于这个的例子 https://community.runabove.com/kb/en/object-storage/how-to-check-file-consistency-using-etag-and-md5.html
确保您的请求与上面 link 的示例相似。
这是我用的卷曲:
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
我真的想通了,我使用的是 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();