【问题标题】:Fix checksum in Artifactory when uploading file through REST API通过 REST API 上传文件时修复 Artifactory 中的校验和
【发布时间】:2017-10-12 06:52:09
【问题描述】:

我正在使用下面的代码通过 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 组是空的,我认为它会呈现上面的消息。

【问题讨论】:

  • 我认为校验和是 sha256。在以下网页中搜索校验和:jfrog.com/confluence/display/RTF/Artifactory+REST+API
  • 我已经更新了我的问题。 sha256 是人工制品可以生成的。我认为这里的问题是空的originalChecksums
  • 再次查看网页。您需要发布:POST /api/checksum/sha256 -H "Content-Type: application/json"。因此,将您的对象流发送到帖子,该帖子将在您上传流之前返回 sha256 校验和。
  • 我不确定您在最后一条评论中的意思。您引用的函数将对已上传到工件的文件计算 sha256。我已经在我的文件上尝试过,但它并没有解决 md5 和 sha1 校验和的问题。
  • 您必须在发送流之前将 sha256 crc 添加到校验和组。否则,您会收到警告消息。因此,要么您必须忽略警告,要么添加 sha256。要添加 SHA crc,您需要在我发布的网页上发送另一篇文章。

标签: c# artifactory dotnet-httpclient


【解决方案1】:

我使用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();

【讨论】:

  • 是的!这正是我解决它的方法。我没有时间更新它,但我必须计算 md5 和 sha1 校验和并将它们添加到标题中。我会将此标记为答案。
  • 能否提供完整的解决方案?
【解决方案2】:

@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 中显示有关校验和的警告。

【讨论】:

  • 我发现 Artifactory 6.5.9 也接受 X-Checksum-Md5 标头,但只需要此处显示的两个标头(Sha1 + Sha256)。如果您遗漏 Md5,您将不会获得 Fix Checknum 按钮
【解决方案3】:

我能够只使用 sha1 标头并且工件停止抱怨,这里有一个 bash sn-p 作为示例:

校验和=sha1sum some.rpm | awk '{ print $1 }' curl -k -umy_user:my_pass -H "X-Checksum-Sha1:$CHECKSUM" -XPUT https://cudgels_are_cool.com/artifactory/some_repo -T some.rpm

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2011-09-26
    • 2017-11-23
    相关资源
    最近更新 更多