Windows环境下使用curl上传zip文件到SFTP服务器后文件损坏的问题

81次阅读
没有评论

问题描述

在Windows环境下使用curl命令上传zip文件到SFTP服务器,但在下载到Mac后解压时出现错误,提示”End-of-central-directory signature not found”。然而,在Mac上执行相同的curl命令上传文件后,下载后可以成功解压。用户希望知道为什么会出现这个问题,以及如何解决。

问题的可能原因

  1. 上传过程中的二进制文件传输问题。
  2. 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:

#!/bin/bash
# 启动容器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命令。

正文完