首页 > 解决方案 > 当存储库中存在人工制品文件时,人工制品 cURL 下载返回 404 File Not Found 错误

问题描述

我正在使用 Artifactory 在我的 CICD 管道中构建工件存储。

我使用 PowerSHell 脚本中的 cURL API 调用编写了工件推送到存储库的脚本:

curl.exe -H "X-JFrog-Art-Api: $apiKey" -X PUT $repoUrl -T $artifactFilePath

这成功执行,工件文件按预期存放在指定的 Artifactory 存储库中。

后来,我尝试使用以下 cURL API 调用下载相同的工件文件:

curl.exe -H "X-JFrog-Art-Api: $apiKey" -X GET $artifactUrl

即使我可以浏览 Artifactory GUI 并清楚地看到子存储库中的工件文件,执行 GET 请求也会返回:

{
  "errors" : [ {
    "status" : 404,
    "message" : "File not found."
  } ]
}

我已经检查并再次检查了他的存储库路径是否正确(它与初始上传请求中的路径一致)。我为每个请求使用了相同的 API 密钥,并确认关联的功能 ID 在存储库中具有读取、写入、注释和删除权限。

我已经为此工作了几个小时,到目前为止还无法识别或解决问题。对此问题的见解或建议将非常受欢迎。

更新:

使用 '-v- 开关执行 cURL 请求以获得详细输出返回:

  • 连接到 www.[Artifactory URL].net (169.177.244.86) 端口 443 (#0)
  • schannel:与 www.[Artifactory URL].net 端口 443 的 SSL/TLS 连接(步骤 1/3)
  • schannel:检查服务器证书吊销
  • schannel:发送初始握手数据:发送 201 字节...
  • schannel:发送初始握手数据:发送201字节
  • schannel:与 www.[Artifactory URL].net 端口 443 的 SSL/TLS 连接(步骤 2/3)
  • schannel:接收握手失败,需要更多数据
  • schannel:与 www.[Artifactory URL].net 端口 443 的 SSL/TLS 连接(步骤 2/3)
  • schannel:加密数据得到 2415
  • schannel:加密数据缓冲区:偏移量 2415 长度 4096
  • schannel:发送下一次握手数据:发送 126 字节...
  • schannel:与 www.[Artifactory URL].net 端口 443 的 SSL/TLS 连接(步骤 2/3)
  • schannel:加密数据得到 290
  • schannel:加密数据缓冲区:偏移量 290 长度 4096
  • schannel:SSL/TLS 握手完成
  • schannel:与 www.[Artifactory URL].net 端口 443 的 SSL/TLS 连接(步骤 3/3)
  • schannel:存储在会话缓存中的凭据句柄

    GET /[Artifactory repo]/[Artifactory repo path]/[artifact file name].txt HTTP/1.1 Host: www.[Artifactory URL].net User-Agent: curl/7.55.1 Accept: / X-JFrog-Art -Api: [API 密钥] 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:-- :-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 -- :--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:-- :-- 0:00:07 --:--:-- 0

  • 哑弹
  • schannel:客户端要读取 102400 字节
  • schannel: encda​​ta_buffer 调整大小 103424
  • schannel:加密数据缓冲区:偏移量 0 长度 103424
  • schannel:加密数据得到 1144
  • schannel:加密数据缓冲区:偏移量 1144 长度 103424
  • schannel:解密数据长度:1115
  • schannel:解密数据添加:1115
  • schannel:已缓存的解密数据:偏移量 1115 长度 102400
  • schannel:加密数据缓冲区:偏移量 0 长度 103424
  • schannel:解密数据缓冲区:偏移量 1115 长度 102400
  • schannel: schannel_recv 清理
  • schannel:解密数据返回1115
  • schannel:解密数据缓冲区:偏移量 0 长度 102400 < HTTP/1.1 200 OK < 日期:2020 年 2 月 19 日,星期三 17:04:58 GMT < Content-Type:text/plain < Content-Length:3 < Connection:keep-alive < Server: Artifactory/6.16.0 < X-Artifactory-Id: d9260ad7ca1d26ab34fdd4717e47fdd9abc8e83f < X-Artifactory-Node-Id: prodnode3 < Last-Modified: Thu, 23 Jan 2020 15:30:10 GMT < ETag: 7744ffc8156c74a9ce68f9cc621ac37624549928 < X-Checksum -Sha1: 7744ffc8156c74a9ce68f9cc621ac37624549928 < X-Checksum-Sha256: b4fae8fae2070cbb6c52c22baf32eb1995be678f93e760dfddb60b166bd1a90f < X-Checksum-Md5: 807dfcc396f827846e9631b735c7e808 < Accept-Ranges: bytes < X-Artifactory-Filename: [artifact file name].txt < Content-Disposition: attachment; filename="[工件文件名].txt"; 文件名*=UTF-8'' [工件文件名].txt < X-Frame-Options: DENY < X-Content-Type-Options: nosniff < X-XSS-Protection: 1; 模式 = 块 < 严格传输安全性:最大年龄 = 31536000;包括子域;preload < Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src“自我”数据:;style-src 'self' 'unsafe-inline'; font-src 'self' 数据:不安全的内联'; font-src 'self' 数据:不安全的内联'; font-src 'self' 数据: https://themes.googleusercontent.com;object-src 'none' < { [3 字节数据] 100 3 0 3 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0100 3 0 3 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0
  • 连接 #0 到主机 www.[Artifactory URL].net 保持原样 Blockquote

标签: curlhttp-status-code-404artifactory

解决方案


最初的 404 问题显然是由于原始 cURL API 调用中我的工件 URL 中的错误。

上面的日志显示了 URL 被纠正后的调用返回。即使使用正确的工件路径,文件似乎也没有按预期下载。注意,上面详细调用日志中的“dud”是文本文件的内容,表示找到并成功读取了该文件。

最后,添加“--output”开关并指定文件名,导致工件文件下载成功。


推荐阅读