从Jfrog流式传文件到Nexus失败,请求排查Payload配置问题
问题分析与修复方案
你的代码主要在Nexus RAW仓库的POST上传参数格式、FileWrapper的读取逻辑以及类方法语法这几个地方出了问题,导致Nexus返回字段缺失和资产重复的报错。
具体错误点
- Payload参数格式错误:
raw.directory不需要用元组包裹,直接传字符串即可;你用raw.asset1.filename的写法不符合Nexus的参数规范,文件名应该和文件对象绑定在files参数中。 - FileWrapper的read方法逻辑缺陷:当前实现忽略了
size参数,导致requests在读取流式数据时生成了多个无效的资产条目,这就是报错里出现asset 1/2/3重复的原因。 - 类方法语法错误:
get_file和stream_file_to_webserver作为类方法,缺少self参数,无法通过类实例正常调用。 - 缺少认证与URL完整性:Nexus上传通常需要Basic认证,且上传URL要指向具体的RAW仓库路径,而非泛泛的
/repository。
修复后的完整代码
import requests from requests.auth import HTTPBasicAuth class FileTransfer: def __init__(self, nexus_auth): self.nexus_auth = nexus_auth def get_file(self): # Jfrog源文件URL,若需认证可添加auth参数 url = "https://webserver.com/big_file.zip" with requests.get(url, stream=True) as file_stream: file_stream.raise_for_status() # 确保源文件请求成功 self.stream_file_to_webserver(file_stream) def stream_file_to_webserver(self, source_response): # 替换为你的Nexus RAW仓库完整URL upload_url = "https://nexus.com/repository/your-raw-repo/" file_wrapper = FileWrapper(source_response.iter_content(chunk_size=8192)) # 正确的目录参数格式 payload = { 'raw.directory': '/' } # 绑定文件对象、文件名和Content-Type files = { 'raw.asset1': ('big_file.zip', file_wrapper, 'application/octet-stream') } with requests.post(upload_url, data=payload, files=files, auth=self.nexus_auth) as response: if response.status_code == 201: print("File uploaded to Nexus successfully.") else: print(f"Failed: {response.text}") class FileWrapper: def __init__(self, file_iterator): self.file_iterator = file_iterator self.buffer = b'' def read(self, size=-1): if size == -1: # 读取全部剩余数据 data = self.buffer self.buffer = b'' for chunk in self.file_iterator: data += chunk return data else: # 按指定大小读取,适配requests的读取逻辑 while len(self.buffer) < size: try: chunk = next(self.file_iterator) self.buffer += chunk except StopIteration: break result = self.buffer[:size] self.buffer = self.buffer[size:] return result # 使用示例 if __name__ == "__main__": # 替换为你的Nexus账号密码 nexus_auth = HTTPBasicAuth("your-username", "your-password") transfer = FileTransfer(nexus_auth) transfer.get_file()
关键修复说明
- FileWrapper优化:添加缓冲区处理,严格按照
size参数返回数据,避免生成无效资产条目; - 参数格式修正:将目录参数放在
data中,文件信息放在files中,完全符合Nexus RAW仓库的批量上传规范; - 语法与认证完善:补全类方法的
self参数,添加Nexus认证,确保请求有权限执行; - 错误增强:添加
raise_for_status()确保源文件请求失败时及时抛出异常,便于排查问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

