You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Jfrog流式传文件到Nexus失败,请求排查Payload配置问题

问题分析与修复方案

你的代码主要在Nexus RAW仓库的POST上传参数格式、FileWrapper的读取逻辑以及类方法语法这几个地方出了问题,导致Nexus返回字段缺失和资产重复的报错。

具体错误点

  1. Payload参数格式错误:raw.directory不需要用元组包裹,直接传字符串即可;你用raw.asset1.filename的写法不符合Nexus的参数规范,文件名应该和文件对象绑定在files参数中。
  2. FileWrapper的read方法逻辑缺陷:当前实现忽略了size参数,导致requests在读取流式数据时生成了多个无效的资产条目,这就是报错里出现asset 1/2/3重复的原因。
  3. 类方法语法错误:get_file和stream_file_to_webserver作为类方法,缺少self参数,无法通过类实例正常调用。
  4. 缺少认证与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:34:57