CI 묻고 답하기

제목 unlink()로 폴더내의 모든파일 삭제 질문입니다.
카테고리 CIBOARD
글쓴이 공부가필요한 작성시각 2018/03/22 09:54:38
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 16878   RSS

업로드한 파일을 s3로 원본과 리사이즈한파일을 업로드후 서버에서는 삭제하도록 작업하고 있습니다.


unlink($resizeimg); // resize img
unlink($target_file); // upload img

 

원본이미지와 리사이즈이미지가 s3에 업로드가 되었다면 두개의 값을 불러와 서버에서 삭제하도록 작업을 하고있습니다.

그런데 리사이즈 이미지는 잘 지워지는데 error_log를 찍어보니원본이미지삭제함수가 두번불러와져 

fopen(uploadtest/1.jpg): failed to open stream: No such file or directory 이런식으로 에러가 뜹니다.

물론 서버에서 삭제되었는데 또불러왔으니 이런 에러가 뜨는건 당연한거지만

대체 어디가 반복문으로 돌고있는지 모르겠습니다.

 

그래서 /uploadtest/* 이런식으로 파일내의 모든파일을 삭제할수있도록 할수있는 방법이있나요?

나름찾아보는데 잘모르겠네요 ,, 선배님들 도움부탁드리겠습니다.

태그 unlink
 다음글 네이티브앱 api를 만들려고합니다. 인증토큰 발생 및 ... (2)
 이전글 외부에서 curl 로 보네는 데이터를 받고 싶습니다. (4)

댓글

kaido / 2018/03/22 10:20:59 / 추천 0

네. 폴더 안에 파일 전체 삭제가 있습니다.

이전에 작업하던 프로젝트에 적용한적 있습니다.

 

저도 동일하게 S3에만 저장 하면 되어서, 업로드하고 나서 S3에 업로드하고 난 다음에 업로드한 파일들은 통째로 지우는 로직을 넣었습니다.

 

unlink 에러는 일단 @unlink 으로 막아두시는것이 좋을것 같습니다.

@ 남발 하는것은 좋지 않지만 unlink 정도에는 exception 처리 느낌 이라서 허용 범위라고 생각 합니다.

 

아 전체 삭제 부분에서 꼼수도 있습니다.

chattr 를 이용해서 해당 폴더는 삭제 금지를 걸어 놓고  폴더 삭제를 걸면  해당 폴더 안에 파일들만 삭제됩니다.

chattr 사용법은 아래의 포스팅을 확인해보세요

http://cikorea.net/bbs/view/tip?idx=19404&lists_style=

이제다시 / 2018/03/22 10:23:11 / 추천 0

file_exists 를 이용하여 파일이 존재하면 삭제하시고 

또는 unlink 앞에 @ 를 붙여서 에러를 출력안하는 방법도 있습니다. 

 

파일 패턴으로 삭제하는 방법은 아래 php manual 을 참조하세요

http://php.net/manual/kr/function.unlink.php

공부가필요한 / 2018/03/22 11:02:57 / 추천 0

@kaido

감사합니다! 먼저 @unlink를 사용하였지만 웹페이지에서는 여전히 같은에러가 뜨고있습니다.

그다음으로 알려주신 chattr을 사용하였습니다 unlink('uploadtest/'); 이렇게사용하였더니 파일을 못찾는다고 나와 rmdir('uploadtest/'); 이렇게 바꿔 사용하였더니 디렉토리가 비어있지않아 삭제가 불가능하다고 나오고있습니다.

제가 폴더삭제를 맞지않게 하고있는건가요? ㅜㅜ

@이제다시

답변감사합니다! @unlink를 사용하였지만 웹페이지에서는 여전히 같은에러가 뜨고있습니다.

​if(file_exists($resizeimg)){
					unlink($resizeimg);
				}elseif(file_exists($file_path)){
					unlink($file_path);
				}

 

이런식으로 반복문을 돌려서 확인하고 삭제하고 확인하고 삭제하려는 코드를 실행했으나.. 역시나 원본파일은 삭제가안되네요.. 혹시 제가 잘못코딩하고있다면 말씀해주시면 감사히생각하며 수정하겠습니다 ㅠㅠ

이제다시 / 2018/03/22 12:42:54 / 추천 0

기본적으로 if 문이 true 에 해당하면 다음에 해당하는 elseif 구문은 실행되지 않습니다. 

에러 메세지로 볼때 해당경로에 파일이 없다는 오류인데

해당 경로에 파일이 존재하는지 확인하시기 바랍니다. 

 

파일위치를 상대경로로 잡으시면 현재 실행되는 파일의 위치부터 상대경로로 동작하니

$_SERVER['DOCUMENT_ROOT'] 를 이용하여 웹루트 부터 해당 파일의 폴더까지 절대경로로 위치를 잡아보시기 바랍니다. 

공부가필요한 / 2018/03/22 14:13:02 / 추천 0

@이제다시

답변감사합니다! upload동시에 반복문을 돌리면 원본파일과 수정파일을 계속 찾을것이라고 착각을했네요 ㅎㅎ..

확인해보니 코드상단에 foreach문이 잘못돌고 있어 삭제파일을 두번씩불러오고있더라구요.

수정해서 해결했습니다. 답변주신 모든분들 감사합니다!