0

データを 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 の定義方法は次のとおりです。

ここに画像の説明を入力

問題は、リクエスト本文ではなく、ファイルのチェックサムを取得しているという事実にあると思います。

  1. ファイルだけではなく、リクエストボディのチェックサムを取得する必要があることを確認したいと思います。

  2. 上記が当てはまる場合、ボディのチェックサムを取得する方法さえわかりません-いくつかのガイダンスが大好きです...

4

2 に答える 2

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

于 2016-01-26T14:23:32.560 に答える
-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();
于 2016-01-26T14:54:09.237 に答える