问题描述
在Windows环境下使用curl命令上传zip文件到SFTP服务器,但在下载到Mac后解压时出现错误,提示”End-of-central-directory signature not found”。然而,在Mac上执行相同的curl命令上传文件后,下载后可以成功解压。用户希望知道为什么会出现这个问题,以及如何解决。
问题的可能原因
- 上传过程中的二进制文件传输问题。
- curl命令在Windows和Mac环境下的默认传输模式差异。
解决方案
请注意以下操作可能因版本差异或其他因素而有所变化,请谨慎操作并在操作前备份数据。
方案1
问题可能是由于Windows环境下curl默认使用的ASCII传输模式导致的。可以通过在curl命令中显式指定二进制传输模式来解决。在命令中加入--ftp-binary
选项,将传输模式设置为二进制。具体操作如下:
$ curl -T ./build_artifact.zip -u 'user:password' ftp://ftp.company.com/devops/test/build_artifact.zip --ftp-ssl-reqd --ftp-create-dirs -k --ftp-binary
使用这个命令上传zip文件时,会强制使用二进制传输模式,从而避免在上传和下载过程中出现损坏的问题。
方案2
如果在你的curl版本中找不到--ftp-binary
选项,你可以尝试升级curl至最新版本,或者使用一些第三方工具来管理上传和下载操作的顺序。这可以确保二进制文件在上传和下载时不会被转换,从而避免损坏问题。以下是一个简单的上传脚本示例,可以在容器A启动后启动容器B:
# 启动容器A | |
docker run -d --name container_a your_image_a | |
# 等待容器A完全启动 | |
while ! docker exec container_a echo "Container A is ready"; do | |
sleep 1 | |
done | |
# 启动容器B | |
docker run -d --name container_b your_image_b |
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。
通过以上两个方案,你可以解决在Windows环境下使用curl上传zip文件到SFTP服务器后文件损坏的问题。选用适合你的方案,根据你的具体需求来配置curl命令。