web-dev-qa-db-ja.com

FTP経由でファイルがアップロードされていることを検出する方法

私のアプリケーションは、ユーザーがファイルをアップロードできる一連のフォルダーを監視しています。ファイルのアップロードが完了すると、処理を適用する必要がありますが、ファイルのアップロードが完了していないことを検出する方法がわかりません。

FTPサーバーによってファイルがまだリリースされていないかどうかを検出する方法はありますか?

17
user2223898

この問題に対する一般的な解決策はありません。

一部のFTPサーバーは、アップロード中のファイルをロックして、ファイルのアップロード中はアクセスできないようにしています。たとえば、IIS FTPサーバーはそれを行います。他のほとんどのFTPサーバーはそれを行いません。 アップロード時にファイルにアクセスできないようにする)で私の回答を参照してください


問題にはいくつかの一般的な回避策があります(元々は SFTPファイルロックメカニズム に投稿されていますが、FTPにも関連しています)。

  • アップロードが完了したら、クライアントに「完了」ファイルをアップロードさせることができます。 「完了」ファイルが表示されるまで自動システムを待機させます。
  • 専用の「アップロード」フォルダを作成し、クライアントに(原子的に)アップロードしたファイルを「完了」フォルダに移動さ​​せることができます。自動化システムが「完了」フォルダのみを参照するようにします。
  • アップロードするファイルのファイル命名規則( ".filepart")を用意し、アップロード後にクライアントに(原子的に)ファイルの名前を最終的な名前に変更させます。自動システムに「.filepart」ファイルを無視させます。
    このアプローチの実装例については、(私の)記事 アップロード中のファイルのロック/一時ファイル名へのアップロード を参照してください。
  • 全体的なハックは、ファイルの属性(サイズと時間)を定期的に確認し、属性が一定の時間間隔で変更されていない場合は、アップロードが完了したと見なすことです。

一部のFTPサーバーでは、アップロードが完了したときに呼び出されるフックを構成できます。あなたはそれを利用することができます。たとえば、ProFTPDには mod_exec module があります(ExecOnCommandディレクティブを参照)。

20
Martin Prikryl

ftputil を使用して、この回避策を実装します。

  1. fTPサーバーに接続する
  2. ディレクトリのすべてのファイルを一覧表示する
  3. 各ファイルでstat()を呼び出す
  4. n秒待つ
  5. ファイルごとに、もう一度stat()を呼び出します。結果が異なる場合は、最後の数秒間に変更されたため、このファイルをスキップします。
  6. Stat()の結果が変わらない場合は、ファイルをダウンロードします。

このFTPフェッチ全体は古く、時代遅れのテクノロジーです。私は顧客が次回最新のhttp APIを使用することを望みます:-)

6
guettli

特定の拡張子のファイルを読み取る場合は、ファイル転送に[〜#〜] winscp [〜#〜]を使用します。拡張子。filepartが付いた一時ファイルが作成され、ファイルが完全に転送されると、実際のファイル拡張子に変わります。

私はそれが誰かを助けることを願っています。

2
Rama Krishna

これはFTP転送の典型的な問題です。私が見つけた唯一のmostly信頼できる方法は、ファイルを送信してから、2番目の短い「マーカー」ファイルを送信して、最初の転送が完了したことを受信者に伝えるだけです。ファイルの命名規則を使用して、2番目のファイルの存在を確認するだけです。

空想になって、2番目のファイルの内容を最初のファイルのチェックサムにするかもしれません。次に、最初のファイルを確認できます。 (ファイルサイズ=チェックサムサイズになるまで待つだけなので、2番目のファイルに問題はありません)。

もちろん、これは、送信者に2番目のファイルを送信させる場合にのみ機能します。

0
A. L. Flanagan