it-swarm-ja.com

アップロード中にファイルにアクセスできないようにする

大きなファイルをFTPサーバーにアップロードした場合、そのファイルは宛先ファイルシステムにすぐに表示され、転送が完了する前に他のユーザーからアクセスされる可能性がありますか?

もしそうなら、転送が完了するまでファイルが読み取られないようにするいくつかの方法は何ですか?

7
yogibear

これは、特定のサーバー実装の動作に完全に依存し、 RFC959 では完全には定義されていません。

一般に、アップロードが226を返すまでサーバーでファイルを使用できず、そのステータスは150です。ファイルがまだ完全にアップロードされていない場合、ステータスレスポンスは550にならず、ファイルは転送されませんクライアントに。

これを行うために、STOU verbは、EOFバイトが到着したときにファイルのアップロードが完了したことを知っているため、その時点でファイル全体がアップロードされているため、226が返されます。

[〜#〜] recv [〜#〜] 動詞は、最初に要求されたファイルのステータスを返します。ファイルが許容可能なステータスの場合、150の応答が期待され、転送が開始されます。

さらに、ほとんどのサーバーサービスはマルチスレッドアプリケーションとして実装されており、ファイルのスレッドセーフは通常、ファイルシステムとサーバーのOSロックに依存していることに注意してください。ほとんどのプラットフォームでは、ファイルがアクティブに書き込まれているとき、ロックが解除されるまで、他のスレッドはそのファイルの読み取りも書き込みもできません。

4
Frank Thomas

理論的には、FTPサーバーは、アップロードされたファイルが他のプロセスや他のFTP接続からアクセスされないようにロックする場合があります。

実際には、* nixサーバーでは発生しません。これをCentOSでPureFTPDとProFTPD(最も広く使用されている* nix FTPサーバー)でテストしました。両方のサーバーで、不完全なファイルをダウンロードすることを妨げるものは何もありません。

一方、Windows IIS FTPサーバーはアップロードされたファイルをロックします。IIS 6.2(Windows 8.1)でテスト済み。

回避策については、私の回答を FileZillaのアップロードはアトミックではない で参照してください。

4
Martin Prikryl

FTPサーバーがProFTPDの隠しストアと同様の機能を許可している場合は、それを試してみてください。

HiddenStoresディレクティブは、2段階のファイルアップロードを有効にします。ファイルは「.in.filename」としてアップロードされます。アップロードが完了すると、名前が「ファイル名」に変更されます。これにより、ある程度の原子性が提供され、1)不完全なアップロードと2)ファイルがアップロードの進行中に使用されるのを防ぐことができます。

ソース: http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html

2