用Python上传工件到Artifactory
我正在尝试用requests库把一些文件上传到一个artfactory的仓库,但我遇到了405错误。我有一个可以正常工作的bash脚本来完成这个任务,但我真的需要一个用python实现的版本。
python
import os
import hashlib
import requests
from requests.auth import HTTPBasicAuth
username = 'me'
password = 'secrets'
target_file = '/home/me/app-1.0.0-snapshot.el6.noarch.rpm'
artifactory_url = 'https://artifactory.company.com/artifactory'
def get_md5(fin):
md5 = hashlib.md5()
with open(fin, 'rb') as f:
for chunk in iter(lambda: f.read(8192), ''):
md5.update(chunk)
return md5.hexdigest()
def get_sha1(fin):
sha1 = hashlib.sha1()
with open(fin, 'rb') as f:
for chunk in iter(lambda: f.read(8192), ''):
sha1.update(chunk)
return sha1.hexdigest()
def upload(fin):
base_file_name = os.path.basename(fin)
md5hash = get_md5(fin)
sha1hash = get_sha1(fin)
headers = {"X-Checksum-Md5": md5hash, "X-Checksum-Sha1": sha1hash}
r = requests.post("{0}/{1}/{2}".format(artifactory_url, "yum-local", base_file_name),auth=(username,password), headers=headers, verify=False, data=open(fin, 'rb'))
return r
bash
art_url="https://artifactory.company.com/artifactory"
user="user"
pass="password"
function upload {
local_file_path=$1
target_folder=$2
if [ ! -f "$local_file_path" ]; then
echo "ERROR: local file $local_file_path does not exists!"
exit 1
fi
which md5sum || exit $?
which sha1sum || exit $?
md5Value="`md5sum "$local_file_path"`"
md5Value="${md5Value:0:32}"
sha1Value="`sha1sum "$local_file_path"`"
sha1Value="${sha1Value:0:40}"
fileName="`basename "$local_file_path"`"
echo $md5Value $sha1Value $local_file_path
echo "INFO: Uploading $local_file_path to $target_folder/$fileName"
curl -i -k -X PUT -u $user:$pass \
-H "X-Checksum-Md5: $md5Value" \
-H "X-Checksum-Sha1: $sha1Value" \
-T "$local_file_path" \
${art_url}/"$target_folder/$fileName"
}
upload "/projects/app.war" "libs-release-local/com/company/app/app-comp/1.0.0/"
3 个回答
-1
在Python 3中,你的迭代器不会停止,因为它们是用''(空字符串)来做结束标志的,其实应该用b''(空字节串)。
7
首先,我注意到你的bash脚本使用的是PUT
,而你的python脚本使用的是POST
。
我看到的另一个可能问题是,你构建URL的方式差别很大。
在bash脚本中,你创建的URL是
https://artifactory.company.com/artifactory/libs-release-local/com/company/app/app-comp/1.0.0//app.war
而在python脚本中,你使用的是
https://artifactory.company.com/artifactory/yum-local/app-1.0.0-snapshot.el6.noarch.rpm
另外,值得注意的是,yum-local
这个部分在你生成的每个URL中都是固定的。
除此之外,你的get_md5
和get_sha1
函数可以写得更简单,因为文件对象是可以迭代的,比如说,
with open(fin, 'rb') as f:
for chunk in f:
md5.update(chunk)
3
错误代码405表示你使用了错误的HTTP方法。根据文档,上传文件时应该使用PUT方法。
这意味着你不能用requests.post
,而是需要用requests.put
。