웹마스터 팁
[시니시즘] 비회원에게 파일 다운로드 권한이 없다고 뜰 때
2015.01.15 01:27
일반적으로 XE에서는 파일 업로드를 하면 비회원이 다운로드를 할 수 있어야 합니다. 해당 모듈->추가설정 페이지를 전혀 건드리지 않았다는 전제하에 default는 "비회원도 다운로드를 할 수 있다" 입니다.
간혹 모듈의 추가설정 페이지를 건드리셔서 다운로드 포인트를 -1 이하, 1 이상으로 설정하실 때 비회원 권한 문제가 있을 수 있다고 들었습니다. (직접 확인해보지 않음)
그리고 다운로드 가능 그룹을 특정 그룹을 선택하셨을 때 (default는 아무 그룹도 선택되지 않은 상태) 비회원 권한 문제가 발생하게 됩니다. (이건 직접 확인해보지 않았지만 당연히 이렇게 되야 한다고 생각함)
그리고 포인트 모듈에서 다운로드 포인트 수치를 -1 이하, 1 이상으로 설정하시거나, "다운로드 금지" 항목에 체크를 하시면 비회원이 다운로드를 못한다고 들었습니다. (직접 확인해보지 않음)
그렇다면 이 모든 부분들이 다 정상적으로 설정되어 있는데 비회원이 다운로드 할 수 없다면??? 왜 그런 것일까?
파일 모듈의 컨트롤러에 가보시면 (/modules/file/file.controller.php) 다음과 같은 함수가 있습니다.
해당 upload_target_srl이라는 컬럼을 가진 첨부파일들을 전부 valid(적합한) 상태로 변경해주는 함수인데요.
/** * Set the attachements of the upload_target_srl to be valid * By changing its state to valid when a document is inserted, it prevents from being considered as a unnecessary file * * @param int $upload_target_srl * @return Object */ function setFilesValid($upload_target_srl) { $args = new stdClass(); $args->upload_target_srl = $upload_target_srl; return executeQuery('file.updateFileValid', $args); }
XE에 파일이 첨부될 때 일반적으로 default로 files 테이블에 isvalid라는 컬럼 값이 N으로 삽입되게 됩니다.
이 말은 즉슨, "아직까지는 사용할 수 없는 파일이다"라는 것을 명시해주는 것이지요.
그러면 언제 이것이 사용가능하게 되느냐. 글쓰기가 완료되고 글을 등록하게 되면 insertDocument (document 모듈에 존재) 함수를 통해 글이 완전하게 등록 성공하면 해당 document_srl을 가진 첨부파일들의 isvalid 값을 전부 Y로 바꿔주게 되고, 실제 다운로드 가능한 파일들로 바뀌게 되는거죠.
왜냐면 글을 등록하는 과정에서 파일은 첨부했는데 글쓰기를 취소할 수도 있고, 글쓰기 자체가 실패할 수도 있는 등의 상황을 피하기 위해서 이렇게 적용한 것으로 보입니다.
저같은 경우는 파일 업로드 부분을 따로 구현을 했는데요. 그냥 form에다가 파일 업로드만 넣어버렸기 때문에 무조건적으로 해당 파일의 isvalid 값이 N인 상태였습니다. 그래서 비회원에게 권한이 없다는 에러를 뿌려줬던 상황이구요.
물론, 이것이 이 이슈의 모든 해결 방법은 아니라고 생각합니다만 저는 그 중에 한가지 상황에 해당되는 방법을 알려드리고 있는 것이구요.
만약 제가 말씀드리는 상황인지 확인하시고 싶으신 분은 일단 webmysql과 같은 본인의 db로 가셔서 xe_files 테이블을 한번 확인해보세요.
upload_target_srl이 document_srl(혹은, module_srl)이기 때문에 이 항목으로 본인이 찾고자 하는 첨부파일을 찾으시구요.
isvalid 컬럼을 한번 확인해보세요. N이라고 되어있으면 지금 이 문제에 해당하는 상황입니다.
문제는 단순히 게시판으로 올렸는데 이런 문제가 발생하면 해당 파일을 지우고 다시 올려보시구요.
그래도 안되면 해당 게시판 모듈에 문제가 있을 수도 있습니다.
그리고 구버전에서는 관련 에러가 날 수 있습니다. 1.7.9에서는 에러가 안나는게 정상.
만약, 본인이 직접 업로드 부분을 구현하셔서 에러가 나시는 거라면 아래처럼 하세요.
// file class의 controller 객체 import $oFileController = &getController('file'); $upload_target_srl = "document_srl 이거나, module_srl 등등"; $output = $oFileController->setFilesValid($upload_target_srl); if(!$output->toBool()) return $output;
아까 위에서 보여드렸던 setFilesValid 함수를 모든 파일을 업로드 하신 뒤에 한번만 호출해주세요.
그러면 해당 upload_target_srl에 연결된 모든 첨부파일의 isvalid 값이 Y로 변경됩니다.
혹시, 해보시고 안되시는 분은 댓글 남겨주세요^^;
PS. 그리고 어떤 분이 XE에서는 파일 업로드가 ajax, editor, iframe으로만 가능하다고 쓰신 글을 봤는데 일반 폼으로도 그냥 가능합니다. 일반폼 파일 업로드가 필요하신 분들은 댓글 남겨주세요^^;