2017-03-23 6 views
0

CakePHP 2.4.4 프로젝트에서 작업하고 있습니다. 그리고 다음과 같은 문제에 직면하고 있습니다. 내 업스트림 업로드 클래스가 새 이미지를 만드는 하나의 함수 newImage을 호출합니다. 예를 들어 하나 이상의 이미지를 다섯 번 업로드하면이 함수는 다섯 번 연속 호출됩니다. 이 함수는 다음과 같은 코드를 포함합니다 :데이터베이스에 레코드를 저장할 시간이 충분하지 않습니다.

...  
...initializing Uploader class 
... 
//creating image 
$this->Orderimage->create(); 
    $data = array(
    'order_id' => $order_id, 
    'filename' => $filename, 
    'date' => date('Y-m-d'), 
    'extension' => $result['ext'], 
); 
$this->Orderimage->save($data); 

그러나 여기 내 문제를 만나는 곳입니다. 4 개 이상의 이미지를 업로드하려고 할 때, 즉이 함수를 연속으로 4 회 이상 호출하면 이미지가 업로드되지 않고 이전 이미지가 업로드됩니다. 그 이유는 이러한 이미지가 동일한 파일 이름을 갖게되기 때문입니다. 그러나 파일 이름은 마지막으로 생성 된 이미지 + 1에 의해 부여됩니다. 따라서 데이터베이스가 다음에 도착할 때 이미지를 저장할 충분한 시간이 없다는 것이 버그입니다. 그리고 이것이 어떤 이미지가 다른 이미지를 덮어 쓰는 이유입니다. 내가 어떻게 고칠 수 있니?

+3

파일 업로드 코드를 공유하지 않았습니다. – tarikul05

+0

@ tarikul05에 대한 이해를 돕기 위해 더 많은 코드를 공유하십시오. 업 로더의 작업 원리는이 함수를 'newImage'함수를 연속으로 호출하는 것입니다. 그게 다야. – Vladislav

+0

코드가 없으면 도움이되지 않습니다. – Mary

답변

1

+1을 사용하는 대신 고유 한 파일 이름으로 설정해보십시오. 예를 들어

:

$filename = CakeText::uuid() . '.jpg'; // or try String::uuid() 

당신에 대한 실수로 같은 파일 이름을 가지고 걱정하지 않아도 그런 식으로.

https://book.cakephp.org/2.0/en/core-utility-libraries/string.html#CakeText::uuid

사이드 참고 : 하나의 디렉토리에 많은 파일을 업로드하는 경우, 그것은 (깊은 3 공통) 중첩 된 디렉토리에 넣어하는 것이 좋습니다. 같은 예를 들어 뭔가 : 당신이 이런 식으로했다면

$filename = rand(0,99) . DS . rand(0,99) . DS . rand(0,99) . $file; 

, 당신이 같은 폴더에 같은 파일 이름 + 숫자 조합을해야합니다 매우 어려울 것. 경로와 파일 이름을 저장하면 갈 수 있습니다. 이렇게하면 하나의 폴더가 영원히 볼 때 너무 많은 이미지를 갖는 것을 막을 수 있습니다.

참고 :이 코드를 머리 꼭대기에서 작성했습니다. 구문을 확인하지 않았지만 아이디어가 있어야합니다.

+0

'String :: uuid();'와 함께 해결했습니다! – Vladislav

0

데이브 솔루션이 문제를 해결해야하지만 사용자가 파일 이름 규칙을 고집하면 마지막 삽입 된 ID를 가져와 $lastInsertedId + $counter과 함께 루프에 모든 이미지를 저장합니다. 나중에 구멍 이미지 배열을 DB에 씁니다.

참고 : 동시 쓰기 요청이없는 경우에만이 솔루션을 사용해야합니다!