例如,我有一些 http 静态服务器。我正在通过 sftp 处理 .js 文件。保持它们同步。我想知道 .js 文件是否会立即被替换,或者 stfp 服务器是否会以流的形式写入该文件?
例如:
- 客户端开始上传文件
- 读取流已打开
- 服务器接受该请求
- 打开写入流到文件位置
- 发送到服务器的块
- 已接受块并将其导入写入流
- http 静态服务器正在尝试访问尚未完全上传的文件并选择部分上传的文件?
- 结果 = 网页上出现 js 错误
或者
- sftp 将整个文件加载到内存中
- 然后将整个文件从内存转储到文件中
对我来说这是最好的情况。
还没有时间检查它是如何工作的。任何解释都是好的。
答案1
scp
并将sftp
就地替换文件,所以是的,理论上 HTTP 客户端可以尝试获取部分上传的文件。
你可以通过使用 SSH 来缓解这个问题rsync
,而不是sftp
因为这会先写入临时文件进而替换文件。rsync
也可以配置为备份它替换的任何文件。
答案2
它不是协议功能。SFTP(作为 SSH 的子协议/子系统)不会决定是否就地或通过临时文件覆盖您的文件,服务器仅执行客户端发送的命令。因此,整个事情应该从客户端的角度来看待。
现在,记住上述内容,根据您选择上传 .js 文件的客户端,您将有不同的行为:
- 安全FTP只会上传并覆盖你的文件
- 同步通过 SSH 可以上传具有临时名称的文件,然后删除旧文件并重命名新上传的文件(更好的选择)
- 在 Windows 世界中,有大量的 SFTP 客户端可以使用临时名称上传和删除/覆盖,其中最常见和最知名的可能是温SCP