2016-06-20 3 views
0

私は、音楽イベント中にライブ画像を撮影する写真家向けの小さなアプリを作成しました。php cronを使って画像ファイルftpが完成したかどうかをチェックする方法

  1. 画像はニコンのカメラから私のftpサーバに送られます。

  2. アプリチェック(クーロン)が指定されたフォルダ内の天気を新しい画像が「開発」フォルダにコピーし、それらを次に

  3. あり、ImageMagickの(リサイズ、フィルタリング及び透かし)でそれらを処理

  4. その後、それらを「送信」フォルダに移動し、指定された受信者に送信される電子メールに添付します。

問題:画像を処理する前に画像が完全にアップロードされているかどうかを確認できます。 cronは5分ごとに実行され、写真家はコンサート中に連続して撮影します。

私はここで同様の質問をしていますが、解決策は実際には見つかりませんでした。だから、重複した質問の場合は、私はそれをお詫び申し上げます。

おかげで、S @ chをする@ X

UPDATE#1 - ここで私はマーク・Setchellの提案を行ったテストです:

`exec("convert -regard-warnings -size 1280x44.879451 xc:none -gravity center -pointsize 24 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©M.Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©M.Setchell' roll/SUBSONICA.JPG +swap -gravity south -geometry +0-3 -composite send/SUBSONICA.JPG && rm roll/SUBSONICA.JPG");` 

`exec("convert -size 1280x44.879451 xc:none -gravity center -pointsize 24 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©M.Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©M.Setchell' roll/SUBSONICA.JPG -regard-warnings +swap -gravity south -geometry +0-3 -composite send/SUBSONICA.JPG && rm roll/SUBSONICA.JPG");` 

後VARSが来るにはPHPから:
-size 1280x44.879451$imageSize = getimagesize($developDir . $developFile);
-annotate 0 '©M.Setchell'$watermark
roll/SUBSONICA.JPG(入力ファイル:$developDir . $developFileforeach文の)
send/SUBSONICA.JPG(出力ファイル:foreach文の$sendDir . $developFile

テストでは、FTP経由で手動で画像のアップロード中に、私が得ましたメールは8つの添付ファイルが必要です。そのうちの4つはまだ部分画像です。

UPDATE#2 - 以下@マークSetchellの更新のように - 私はexec関数で出力し、実行したコマンドの戻りステータスのVARの配列を追加しました。

その後、簡単なif ... else文で、私は簡単に結果を分析することができます:

  • 場合(リターン・ステータス== )の画像ファイルが有効でないと1を完了したので、我々は削除
  • else(返信ステータス== )のファイルは、&という完全な画像ファイルです:私たちは、写真家が送信するftpフォルダからファイルを削除します。 Nikonカメラからの画像(私のアプリの "ロール"フォルダ)。

ので、@マークSetchellの回答に基づいて正確かつ完全exec文字列は、次のとおりです。

exec("convert $im_cmd", $convert_output, $returned_var); 
    if ($returned_var) { 
     unlink($send_dir . "/" . $developFile); 

    } else { 
     unlink($develop_dir . "/" . $developFile); 
    } 

をこのソリューションは完璧に動作します:

`convert -regard-warnings -size 1024x40 xc:none -gravity center -pointsize 20 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©2016 Mark Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©2016 Mark Setchell' roll/SUBSONICA_small.jpg +swap -gravity south -geometry +0-3 -composite send/SUBSONICA_small.jpg` 

ここで完全に働いたコードスニペットです10回のテストの後では、超信頼性が証明されました。最初の質問として、ファイルをチェックする代わりに@Mark Setchellのアプローチ - Imagemagickコンバージョンの-regard-warningsオプションの使用ertプログラムlink - 問題を解決しました。

+0

PHPはないかもしれませんこの場合、最善のアプローチになります。すべての画像がアップロードされるまで待機する必要がありますか?写真家がこれ以上写真を撮らないことを決定したという考えはどのようにサーバーにありますか?または、個々のファイルを処理する前に完全にアップロードされていることを確認したいだけですか? –

+0

NikonからFTPサーバーにInagesを転送するソフトウェアは何ですか?それがあなたのコントロール下にあるならば、画像を 'xyz.upload'として起動し、完了したら' xyz'と名前を変更することができます。サーバ上では '.upload'で終わるファイルは無視します。 –

+0

@Lotharyx個々のファイルを処理する前に完全にアップロードされていることを確認したいだけです。スクリプトは5分ごとにcronジョブとして実行されます。実行するたびに、 "camera_roll"ディレクトリをチェックして、処理するイメージがあるかどうかを確認します。イメージを見つけた場合は、イメージを別のディレクトリに渡して処理します。したがって、それは継続的に実行されます。コンサート中、写真家が撮影して最高の画像をサーバーに送ると、そのプロセスはその仕事をします。しかし、私は移動しているファイルがまだ転送されているかどうかを知る必要があります。 – sachax

答えて

0

更新回答

[OK]を、私たちは今近くにあります!コマンドラインではなくPHPを使用する場合は、戻り値をexec()から取得し、その値に依存するものを取得する必要があります。あなたがhereをチェックするのであれば、あなたは戻り値を取得する方法を見ることができます:

exec("convert -regard-warnings inputfile ... resize ... filter ... output/outputfile",array &$output, int &$return_var); 

その後、$return_varコマンドが働いていたので、あなたが入力ファイルを削除する必要がある、ゼロであれば、それが非であればゼロでない場合は、出力ファイルを削除する必要があります。あなたはファイルが不完全な場合ImageMagickのはあなたを教えてみましょうことができ

オリジナル回答

。 FTPディレクトリから"en masse"をコピーするのではなく、Imagemagick convertを使用して処理されたディレクトリにファイルを処理し、正常に処理されたファイルのみを削除し、他のファイルは処理されずにそのまま残します。それらが不完全であることに基づいて次のcron呼び出し。したがって、このような何か:

cd FTPDirectory 
for f in *.jpg; do 
    convert -regard-warnings ... resize ... sharpen ... "%f" processed/"%f" 
    # If successful, delete source file 
    if [ $? -eq 0 ]; then 
     rm "%f" 
    fi 
done 

-regard-warningsフラグがエラーとして処理されるべき警告の原因となります。私はそれを使用しない場合、不完全なファイルを処理するときに、私は何のエラー状態を取得していない:私はそれを使用しない場合、私はキャッチ可能なエラーを取得するのに対し

convert incomplete.jpg processed.jpg 
convert: Premature end of JPEG file `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352. 
convert: Corrupt JPEG data: premature end of data segment `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352. 

echo $? 
0 

convert -regard-warnings incomplete.jpg processed.jpg 
convert: Premature end of JPEG file `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352. 
convert: Corrupt JPEG data: premature end of data segment `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352. 

echo $? 
1 
+0

モーツァルトのピアノソナタのようなサウンド。私がそれをテストする唯一の問題は、私がcliの専門家ではなく、PHPでアプリケーションを書いたので、 'scandir()'でファイルをチェックし、 'exec(" convert ...)でImageMagickコマンドを実行することです。 ")'。問題は:PHP全体の条件付き構造をexecコマンドに追加できますか? – sachax

+0

もちろん、 'exec(" convert inputFile -regard-warnings ... processed/outputFile.jpg && rm inputFile ");' –

+0

や、 'output_array'と' return_var'を 'exec'に追加することができます。 'return_var'をテストし、ファイルがゼロであればそれを削除します - つまり、コマンドがうまくいけば... http://php.net/manual/en/function.exec.php –

関連する問題