使用Curl向Nexus上传NuGet包返回400错误是什么原因
问题原因
返回的400错误已经明确给出根因:Multipart request required。
你当前使用curl --upload-file 参数直接PUT文件的方式,是将nupkg文件直接作为整个请求体发送,不符合NuGet协议对包上传接口的格式要求——NuGet上传接口强制要求请求为multipart/form-data编码的多部分表单格式,该错误和目标仓库是否已存在同名包无关。
另外需要提前确认:你要上传的目标仓库package_nuget_for_portal必须是**hosted(托管)**类型的NuGet仓库,group(仓库组)、proxy(代理)类型的NuGet仓库本身不支持包上传操作,即使请求格式正确也会报错。
修复方案
方案1:调整curl命令格式(继续用curl上传)
放弃--upload-file参数,改用-F参数构造符合要求的multipart表单请求,正确命令如下:
curl -v -u admin:pwd \ -F "package=@./azure.core.1.24.0.nupkg" \ http://10.20.1.78:8081/repository/package_nuget_for_portal/
注意要点:
- 表单字段名固定为
package,这是NuGet上传接口的强制要求,不能自定义 - 本地文件路径前必须加
@标识,告知curl读取本地文件内容作为表单字段值 - 请求地址直接填仓库根路径即可,不需要手动拼接nupkg文件名
- 不要手动添加
Content-Type请求头,curl使用-F参数时会自动生成带正确boundary分隔符的multipart/form-data头,手动指定反而会导致boundary缺失触发格式错误
方案2:使用官方NuGet客户端推送(推荐)
手动构造curl请求容易出现格式兼容问题,优先使用NuGet官方客户端推送,稳定性更高:
- 首先将Nexus NuGet仓库添加为本地NuGet源:
nuget sources add -Name NexusPortalRepo -Source http://10.20.1.78:8081/repository/package_nuget_for_portal/ -Username admin -Password pwd
- 执行包推送命令:
nuget push ./azure.core.1.24.0.nupkg -Source NexusPortalRepo
如果使用的是NuGet V3版本的API,源地址填V3格式的http://10.20.1.78:8081/repository/package_nuget_for_portal/index.json即可。
内容的提问来源于stack exchange,提问作者eli shani
相关产品推荐
相关产品推荐

