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

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

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

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

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

 

답변 3개

채택된 답변
+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호출해서 파일 삭제하는것을 하려고 합니다.

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

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

로그인
🐛 버그신고