2016-10-04 6 views
0

Laravel 5.2을 사용하여 최대 10 개의 이미지를 선택하고 미리보기를 표시 한 다음 이미지를 추가하거나 업로드하지 않으려는 이미지를 추가 할 수 있도록 업로드 양식을 작성 중입니다.Laravel을 사용하여 파일을 임시 저장하는 방법은 무엇입니까?

미리보기의 정렬 및 제거는 자바 스크립트를 사용하여 쉽게 수행 할 수 있지만 그 외에는 나머지 작업을 올바르게 수행하는 방법을 찾는 데 어려움을 겪고 있습니다. 필자의 원래 아이디어는 입력에서 js 파일 배열을 가져 와서 다른 배열로 옮기고 사용자가 이미지 미리보기와 상호 작용하면을 사용하여 표시됩니다. 그는 양식을 제출하면

는 I는 FormData 객체를 생성 입력의 현재 파일을 제거하고 유효한 모든 것들을 추가합니다 :

var formdata = new FormData(document.getElementById('upload-form')); 
if (formdata.has('pic[]') && validFiles.length) { 
    formdata.delete("pic[]"); 
    var len = validFiles.length; 
    for (i = 0; i < len; i++) { 
     formdata.append("pic[]", validFiles[i]); 
    } 

} 

당신이 당신의 방법은 주위에 이미이 방법을 볼 수 있습니다 JS 알고있는 경우를 이 때 심각한 문제가 거꾸로 compatibillity의 FormData.delete(..), .append(..).has(..) 방법은 (거의 크롬 50 이하 또는 IE. 포함) 이전 버전의 브라우저

좋아 스크랩 그 생각에 의해 지원되지 않기 때문에. 내 두 번째 생각은 다음을 수행하는 것이 었습니다 :

  1. 사용자가 추가 할 이미지를 선택
  2. 업로드 이미지
  3. 사용자가 미리보기를 사용하자 아약스를 사용하여 어딘가에 Laravel
  4. 반환 이미지 미리보기를 사용하여 일시적으로 저장했다 파일을 재정리하거나 파일을 제거하고 그가하는 일을 추적하십시오.
  5. 양식이 제출되면 다른 모든 정보를 가져 와서 어떤 파일을 영원히 저장할 것인지 그리고 어떤 파일을 삭제하고 저장할지 결정하십시오.

이제는 어떻게하는지 잘 모르겠습니다. 나는이 이미지들을위한 tmp 디렉토리를 가지고 있고, 사용자 세션과 연관된 디렉토리의 이름이 될 어떤 종류의 문자열을 생성하고 거기에 파일을 저장하고 Session을 사용하여 디렉토리 이름을 저장한다고 생각했다.

이 문제는 Session에 전역 시간 제한이있는 것으로 보이며 15 분이 지나면 만료되도록 설정할 수 없습니다. 내가 보는 또 다른 문제는 Session 만료시 코드를 실행할 수있는 방법을 찾을 수 없으므로 Session이 만료되고 사용자가 이미지를 업로드하지 않기로 결정했다면 영원히 서버에 남아있게됩니다.

그렇다면 Laravel에서 임시 파일 저장을 수행하는 적절한 방법은 무엇입니까? 여기 잘못된 방향으로 가고 있으며 내가하려고하는 것을하기위한 더 좋은 방법을 볼 수 있습니까?

미리 조언 해 주셔서 감사합니다.

답변

0

두 번째 아이디어는 이동하는 방법 인 것처럼 보이지만 약간 수정되었습니다.

이 방법에 대해 :

<?php 
// Collect a list of files in a $tempLocation (modify this to your usage) 
collect(\File::files($tempLocation))->map(function($file) { 
    return [ 
     'file' => $file, 
     'basename' => pathinfo($file)['filename'] 
    ]; 
// Filter out the non-numeric files and those that are before now 
})->filter(function($a) { 
    return is_numeric($a['basename']) && $a['basename'] < time(); 
// Delete each file that is outdated 
})->each(function($file) { 
    try { unlink($file['file']); } catch($e) { /* Fill me in */ } 
}); 

귀하의 일반적인 워크 플로우는 다음 명칭과 사용자의 파일을 업로드하는 것입니다 :

{timestamp + timeout}.{ext}

당신은 다음에 위의 기능을 넣을 것 매일 또는 매주 cron. 모든 "이전"파일이 삭제됩니다. 사용자가 파일을 보관하려면 임시 디렉토리가 아닌 다른 곳으로 파일을 이동하거나 숫자가 아닌 파일로 이름을 변경하십시오.

이것은 프론트 엔드가 파일을 삭제하거나 백엔드에 폐기해야한다는 사실을 알릴 필요가 없음을 의미합니다.

이 정보가 도움이되기를 바랍니다.

관련 문제