2011-03-29 6 views
1

두 개의 플래시/항공 응용 프로그램에 대해 실제 "백엔드"(PHP5)를 만들고 있습니다. 그 중 하나는 사진을 업로드하고, 백엔드는이를 폴더에 저장하며, 두 번째 앱은 백엔드에서 새 사진을 폴링하여 보여줍니다.완료된 파일 만 가져 오기

데이터베이스에 액세스 할 수 없으므로 백엔드는 PHP5 이상이어야합니다. 그래서 이미지를 폴더에 저장하고 (이름에 타임 스탬프 포함) readdir()을 사용하여 이미지를 다시 가져 왔습니다.

이 모든 것이 매력처럼 작동합니다. 그럼에도 불구하고, 나는 정말로 후위가 단지 업로드 된 사진을 돌려주고, 두 번째 앱이 미완성 이미지를로드하지 못하도록하고 싶습니다. 파일을 검증하는 데 사용할 수있는 방법이나 트릭이 있습니까?

+0

파일이 완전히 쓰여지는 한 가지 방법은 업로드 과정이 그 연습을 따라갈 때'flock (.., LOCK_EX | LOCK_NB) '으로 파일을 폴링하는 것입니다. – mario

답변

0

당신은 몇 백 밀리 초 떨어져 파일 크기를 확인하고 변경하는 경우 볼 수 있습니다 :

$first = filesize($file); 
// wait 100ms 
usleep(100000); 
$second = filesize($file); 

if($first == $second) { 
    // file is no longer being actively uploaded 
} 
0

정말 쉽고 일반적인 방법 이렇게하려면 파일 이름을 기준으로 트리거 파일을 생성하는 것입니다, 그래서 당신은

123.jpg 
123.rdy 

또는

123.jpg 
123.jpg.rdy 

당신은 그 파일을 생성 뭔가를 얻을 (그냥 빈 스텁) 업로드가 완료되면. 로드 할 파일을 잡는 응용 프로그램은 트리거 파일로 파일을 처리 한 다음 해당 파일을 처리합니다. 또는 업로드 한 파일을 ie로 저장할 수도 있습니다. 123.bsy 또는 123.jpg.bsy을 업로드 한 다음 업로드가 완료된 후 피날레 이름 123.jpg으로 이름을 바꿉니다. 같은 디렉터리에있는 이름 바꾸기는 일반적으로 처리 시간면에서 값싼 작업이므로 경쟁 조건에서 실행될 가능성은 매우 낮습니다. (이것은 사용중인 OS에 따라 달라질 수 있습니다 ...)

여기에 파일을 보관해야하는 경우 각 파일에 레코드를 추가하는 데이터베이스를 사용할 수 있지만, 업로드가 완료되면 다른 응용 프로그램은 일치하는 데이터베이스 레코드가있는 파일을 제공 할 수 있습니다.

0

원자 파일 시스템 작업의 일반적인 트릭은 리더와 일치하지 않는 임시 파일 (예 : XXX.jpg.tmp)에 작성하고 완전히 업로드 한 후 대상 이름으로 바꿉니다. 동일한 볼륨의 이름 바꾸기는 원자 단위이므로 파일이 불완전하거나 사용할 수없는 지점이 없습니다.

0

이 글을 모두 쓰고 나면 나 자신을 깜짝 놀라게했다. 내가 한 일은 정확한 바이트 수를 파일 이름에 추가하여 이미지 목록을 출력하는 동안 유효성을 검사하는 것입니다. .tmp/.bsy-sollution도 좋습니다. 그러나 조금 늦었습니다. :) 내 솔루션의 장점은 업로드가 끝난 후에 더 이상 이름을 변경하지 않아도된다는 것입니다. 빠른 답변을 보내 주신 모든 분들께 감사드립니다!