이전 목록 다음
채택완료

allow_url_fopen 설정 on 안하고 Zip 파일로 다운로드 못하나요?

쉐어링되는 호스팅 구조를 갖고있어서

호스팅사에서 allow_url_fopen 설정을 개방할수가 없다고 한 상태인데

그럼, ZipArchive 말고는 웹상에서 여러이미지를

Zip 으로 묶어서 다운로드 받는방법은 없을까요?

 

답변 3개 / 댓글 13개

채택된 답변
+20 포인트

allow_url_fopen 이걸 오픈시 외부에서 include를 할수 있도록 허용하는 부분이라 제한하는 부분이고요
php로 파일을 압축해서 받도록 처리하시려는 작업을 위해서는 zip 압축이 용이한 부분입니다.

답변에 대한 댓글 5개

ZipArchive 써서 Zip 으로 묶으려니까 에러가 나는데
allow_url_fopen 설정은 off로 하든 상관없는건가요?
네 그 문제로 발생되는 오류가 아닌듯 합니다.
자세한건 어떠한 오류인지를 알아야 피드백을 드릴수 있을듯 합니다.
$sql1 = " select * from {$_table_name} where abcd = 'abcd' ";
$rst1 = $conn->query($sql1);

//압축할 파일들의 경로
$_file_list = array();
if ($rst1->num_rows > 0) {
while($row = $rst1->fetch_assoc()) {
array_push($_file_list, array(
'filename' => $row['filename'],
'imgurl' => $row['imgurl']
));
}
}else{
echo "<script>alert('업로드된 파일이 없습니다');</script>";
}

//다운로드되는 파일명
$zip_name = "abcd.zip";

$zip = new ZipArchive();
if ($zip->open($zip_name, ZipArchive::CREATE) !== true){
exit("cannot open [".$zip_name."]");
}

$cnt = 0;
foreach($_file_list as $files){
echo $files[$cnt]["imgurl"];
$zip->addFile($files[$cnt]["imgurl"], $files[$cnt]["filename"]);
$cnt++;
}


$zip->close();

header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=".$zip_name);
header("Pragma: no-cache");
header("Expires: 0");

readfile($zip_name);
unlink($zip_name);

-----------------------------
코드는 이렇구요

zip 파일은 다운로드까지 되는데 열면 형식이 올바르지 않다고 나오고
안에 아무것도 없어요

$files[$cnt]["imgurl"]
는 파일명까지 포함된 경로입니다.

PHP 버전은 5.6이에요
압축하는 과정중에 경로의 문제는 없는지 체크해 보셔야 할듯 합니다.
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=".$zip_name);
header("Pragma: no-cache");
header("Expires: 0");

헤더구분에서 문제가 있었던것같습니다.
아직도 이유를 찾지 못했지만 아마도 zip 파일을 ZipArchive로 생성된것과 무관하게
임시로 zip 파일을 다운받아버려서 문제가 생긴것같긴한데...

일단
ZipArchive을 이용한 zip 파일이 정상적으로 생성되는것을 확인했고
생성 후 자바스크립트로 다운받는것까지 정상적으로 되는것을 확인해서
이후 일단 임시 zip 파일 생성한걸 ajax로 php호출해서 파일 삭제하는것을 하려고 합니다.

https://gurtn.tistory.com/64

위 링크 참고 해보세용

압축파일 오류는 첨부파일 경로가 안맞아서 오류나는거라고 하네용

 

답변에 대한 댓글 1개

header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=".$zip_name);
header("Pragma: no-cache");
header("Expires: 0");

헤더구분에서 문제가 있었던것같습니다.
아직도 이유를 찾지 못했지만 아마도 zip 파일을 ZipArchive로 생성된것과 무관하게
임시로 zip 파일을 다운받아버려서 문제가 생긴것같긴한데...

일단
ZipArchive을 이용한 zip 파일이 정상적으로 생성되는것을 확인했고
생성 후 자바스크립트로 다운받는것까지 정상적으로 되는것을 확인해서
이후 일단 임시 zip 파일 생성한걸 ajax로 php호출해서 파일 삭제하는것을 하려고 합니다.

$files[$cnt]["imgurl"] 이게 로컬파일이 아니라 외부파일 uri 인가보네요.

curl 관련함수로 로컬로 가져온다음

압축하는 방법도 있을것 같습니다.

답변에 대한 댓글 7개

서버상에 올라가있는 파일경로+파일명 이에요
그러면 allow_url_fopen 가 따로 개입할일은 없을것 같은데
allow_url_fopen 관련 무슨 에러가 발생하나요?
에러내용이 있어야 추가 확인이 가능할것 같습니다.
에러가 따로 발생하는건 아니고 .zip 파일 다운로드까지 되는데
열려고하면 폴더를 열수없습니다 'xxxxx.zip'가 올바르지 않습니다 라고 뜨고
압축풀려고하면 [zip]압축파일로 파일을 열 수 없습니다 압축되지 않았습니다.
라고 떠요.

일반파일을 강제로 확장자만 .zip 으로 바꾼 느낌이랄까...
경로는 확인해봤는데 이상없더라구요...뭐가문제일까요...

allow_url_fopen 는
혹시나 ZipArchive 가 플러그인 형태로 서버세팅시
확장기능 세팅같은걸 해야할까 싶어서 호스팅업체에 문의했더니
allow_url_fopen 를 on 할수없다고만 답변을 받아서
당연히 관련있는건줄알고 여기 질문올릴때 그렇게 쓴거에요.
그럼 이부분을 디버깅 해보셔야 할것 같네요.
[code]
echo $files[$cnt]["imgurl"]; // 출력 및 실제경로 파일존재유무 확인
echo $files[$cnt]["filename"]; // 이름 정상 출력 확인
$zip->addFile($files[$cnt]["imgurl"], $files[$cnt]["filename"]); // 내부 함수 동작 디버깅
[/code]
$files[$cnt]["imgurl"]; 는 $files["imgurl"]; 로 수정해서 정상적으로 출력되는거 확인했어요.
$files["filename"]; 도 마찬가지구요.
몇가지 걸리는게...
혹시 경로가 물리적 경로여야되나요?
http://www.abcd.com/ 도메인주소를 포함한 경로가 아닌 /home/호스팅아이디/html/ 형태의 경로여야되는건지....

그리고 경로에 한글이 포함되어있긴한데....

루트에 ziptest 만들고 파일 두개만 넣어놓고 해도 똑같네요...왜그런지 도저히 모르겠네요 ㅋㅋㅋ

php버전은 상관없는건지...
하긴 구문에 오류가있었다면 페이지 자체에서 에러를 띄웠겠져?...;;
http:// ... 로 나가면 그게 곧 외부 파일인거고 거기서 파일을 못가져왔을 확률이 높습니다.
서버 안의 물리적 절대경로가 되어야 할것 같구요 (/home/abc/...)
그 경로에 파일이 올바로 있는지 확인이 되어야 하고
한글 포함 같은 경우엔 urlencode 적용시켜 보세요
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=".$zip_name);
header("Pragma: no-cache");
header("Expires: 0");

헤더구분에서 문제가 있었던것같습니다.
아직도 이유를 찾지 못했지만 아마도 zip 파일을 ZipArchive로 생성된것과 무관하게
임시로 zip 파일을 다운받아버려서 문제가 생긴것같긴한데...

일단
ZipArchive을 이용한 zip 파일이 정상적으로 생성되는것을 확인했고
생성 후 자바스크립트로 다운받는것까지 정상적으로 되는것을 확인해서
이후 일단 임시 zip 파일 생성한걸 ajax로 php호출해서 파일 삭제하는것을 하려고 합니다.

답변을 작성하려면 로그인이 필요합니다.

🐛 버그신고