通过REST API上载文件时修复Artifactory中的校验和

时间:2017-10-12 06:52:09

标签: c# artifactory dotnet-httpclient

我正在使用下面的代码通过Artifactory的REST API上传文件。 我的问题是,当我通过GUI查看文件时,我收到此消息:

  

客户端未发布校验和值。如果您信任上传的   通过单击“修复”,您可以接受实际的校验和   校验和'按钮。

如何修复上传以使此消息消失?

如果我通过GUI上传文件,我不提供校验和值,那么为什么我在使用API​​时必须这样做呢?在使用API​​修复校验和时,我可以调用额外的函数吗?

我也看到了这个设置:https://www.jfrog.com/confluence/display/RTF20/Handling+Checksums 这可能与我的问题有关吗?

string inFilePath = @"C:\temp\file.ext";
string inUrl = @"domain.com/repoKey/";
string username = "username";
string apiKey = "apikey";

using (HttpClient client = new HttpClient())
{
    client.DefaultRequestHeaders.Authorization =
        new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(username+":"+apiKey)));

    using (var stream = File.OpenRead(inFilePath))
    {
        var response = client.PutAsync(inUrl + stream.Name, new StreamContent(stream));

        using (HttpContent content = response.Result.Content)
        {
            string data = content.ReadAsStringAsync().Result;
        }
    }
}

更新

有三种类型的校验和和两组校验和组。

"checksums" : {
  "sha1" : "94332c090bdcdd87bd86426c224bcc7dc1c5f784",
  "md5" : "dcada413214a5bd7164c6961863f5111",
  "sha256" : "049c671f48e94c1ad25500f64e4879312cae70f489edc21313334b3f77b631e6"
},
"originalChecksums" : {
  "sha1" : "94332c090bdcdd87bd86426c224bcc7dc1c5f784",
  "md5" : "dcada413214a5bd7164c6961863f5111"
}

checksums - 由Artifactory计算 originalChecksums - 是上传者提供的

当我使用API​​时,originalChecksums组为空,我认为会在上面显示该消息。

4 个答案:

答案 0 :(得分:5)

我使用artifactory-client-java库遇到同样的问题: - (

因此,在某些digging之后,您似乎需要:

  • 计算客户端(sha1)的校验和
  • 在PUT请求中将每个校验和提供为HTTP标头

对于您的C#示例,正确的解决方案是使用计算的校验和添加标题“X-Checksum-Sha1”。 如链接文档中所述,一个简单的curl示例是

curl -uadmin:password -T file.jar -H "X-Checksum-Sha1:c9a355147857198da3bdb3f24c4e90bd98a61e8b""http://localhost:8081/artifactory/libs-release-local/file.jar" -i

对于artifactory-client-java用户,简单的解决方法是添加到文档化的上传示例中:

java.io.File file = new java.io.File("fileToUpload.txt");
File result = artifactory.repository("RepoName").upload("path/to/newName.txt", file).doUpload();

另一个中间呼叫: bySha1Checksum()

java.io.File file = new java.io.File("fileToUpload.txt");
File result = artifactory.repository("RepoName").upload("path/to/newName.txt", file).bySha1Checksum().doUpload();

答案 1 :(得分:3)

@Arnaud Jeansen的回答是正确的。我以为我会与校验和共享我的bash / curl脚本以进行部署,以提供更多详细信息。

这是从Artifactory 6.2起最新的信息,以及撰写本文的日期。

# assume test2.zip is the file to upload in current directory

# calculate checksums
sha256=$(openssl dgst -sha256 test2.zip|sed 's/^SHA256.*= //')
sha1=$(openssl dgst -sha1 test2.zip|sed 's/^SHA.*= //')

# upload to Artifactory
curl -u"${ARTIFACTORY_USER}:${ARTIFACTORY_PASSWORD}" \
 -sS -T test2.zip  \
 -H "X-Checksum-Sha256:${sha256}" -H "X-Checksum-Sha1:${sha1}" \
 "http://${ARTIFACTORY_HOST}:8081/artifactory/REPO/path/test2.zip" \
 > response

 jq '.' < response
 echo ''

结果工件不会在UI中显示有关校验和的警告。

答案 2 :(得分:1)

好的,所以我不得不使用一个似乎不属于api的功能。

我需要获取“修复校验和”按钮调用的URL,并且还包含repo和文件名作为内容的一部分。下面的代码对我有用。

filename = "filename from previous insert";
inUrl = "domain.com/ui/checksums/fix";
var stringPayload = "{\"repoKey\":\"repoKey\",\"path\":\"" + filename + "\"}";
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");

var resp = client.PostAsync(inUrl, httpContent);

using (HttpContent content = resp.Result.Content)
{
    string result = content.ReadAsStringAsync().Result;
}

答案 3 :(得分:0)

我能够只使用sha1标头,而人工制品则不再抱怨,这是一个bash片段,例如:

CHECKSUM = lambda curl -k -umy_user:my_pass -H“ X-Checksum-Sha1:$ CHECKSUM” -XPUT https://cudgels_are_cool.com/artifactory/some_repo -T some.rpm