공홈에 등록된 첨부파일을 외부로! 의 사용법이 궁금합니다.
https://xe1.xpressengine.com/index.php?mid=download&package_id=22753684
본문에 첨부된 사용법 링크는 사라졌네요...
설정에는 업로드서버주소, 업로드폴더, 비밀키를 입력받게 되있네요.
업로드 서버에 뭔가를 따로 설정해줘야 비밀키를 통해 접속 할것같습니다.
lua_external_file.addon.php
<?php
if(!defined('__XE__')) exit();
if(Context::get("act") == "procFileDownload" && $called_position == "before_module_proc"){
$oFM = getModel("file");
$columnList = array('source_filename', 'uploaded_filename', 'upload_target_srl', 'module_srl');
$file_obj = $oFM->getFile(Context::get("file_srl"), $columnList);
if(str_replace("index.php", "", $file_obj->uploaded_filename) != $file_obj->uploaded_filename) return;
$ch = curl_init();
$sk = explode("/", $file_obj->uploaded_filename);
array_pop($sk);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'key' => $addon_info->secret, 'dir' => implode("/", $sk), 'file' => '@' . $file_obj->uploaded_filename . ';filename=' . Context::get("file_srl")));
curl_setopt($ch, CURLOPT_URL, "http://" . $addon_info->upload . "/upload.php");
curl_exec($ch);
curl_close($ch);
$args = new stdClass;
$args->file_srl = Context::get("file_srl");
$args->uploaded_filename = "index.php?addon_ext=external_file&file_srl=" . Context::get("file_srl");
$args->module_srl = $file_obj->module_srl;
$args->upload_target_srl = $file_obj->upload_target_srl;
executeQuery('file.updateFile', $args);
@unlink($file_obj->uploaded_filename);
}
if(Context::get("act") == "procFileOutput" || Context::get("addon_ext") == "external_file"){
$oFM = getModel("file");
$columnList = array('source_filename', 'uploaded_filename', 'upload_target_srl', 'module_srl', 'direct_download');
$file_obj = $oFM->getFile(Context::get("file_srl"), $columnList);
$types = "binaries";
if($file_obj->direct_download == "Y") $types = "images";
$url = "http://" . $addon_info->upload . "/" . $addon_info->upload_fol . "/files/attach/" . $types . "/" . $file_obj->module_srl . "/" . $file_obj->upload_target_srl . "/" . Context::get("file_srl");
$buff = FileHandler::getRemoteResource($url, null, 3, 'GET', "image/png");
header("Cache-Control: ");
header("Pragma: ");
$t = "application/octet-stream";
header("Content-Type: " . $t);
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-Length: " .sizeof($buff));
header('Content-Disposition: attachment; filename="'.$file_obj->source_filename.'"');
header("Content-Transfer-Encoding: binary\n");
echo $buff;
exit();
}
if(!defined('__XE__')) exit();
if(Context::get("act") == "procFileDownload" && $called_position == "before_module_proc"){
$oFM = getModel("file");
$columnList = array('source_filename', 'uploaded_filename', 'upload_target_srl', 'module_srl');
$file_obj = $oFM->getFile(Context::get("file_srl"), $columnList);
if(str_replace("index.php", "", $file_obj->uploaded_filename) != $file_obj->uploaded_filename) return;
$ch = curl_init();
$sk = explode("/", $file_obj->uploaded_filename);
array_pop($sk);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'key' => $addon_info->secret, 'dir' => implode("/", $sk), 'file' => '@' . $file_obj->uploaded_filename . ';filename=' . Context::get("file_srl")));
curl_setopt($ch, CURLOPT_URL, "http://" . $addon_info->upload . "/upload.php");
curl_exec($ch);
curl_close($ch);
$args = new stdClass;
$args->file_srl = Context::get("file_srl");
$args->uploaded_filename = "index.php?addon_ext=external_file&file_srl=" . Context::get("file_srl");
$args->module_srl = $file_obj->module_srl;
$args->upload_target_srl = $file_obj->upload_target_srl;
executeQuery('file.updateFile', $args);
@unlink($file_obj->uploaded_filename);
}
if(Context::get("act") == "procFileOutput" || Context::get("addon_ext") == "external_file"){
$oFM = getModel("file");
$columnList = array('source_filename', 'uploaded_filename', 'upload_target_srl', 'module_srl', 'direct_download');
$file_obj = $oFM->getFile(Context::get("file_srl"), $columnList);
$types = "binaries";
if($file_obj->direct_download == "Y") $types = "images";
$url = "http://" . $addon_info->upload . "/" . $addon_info->upload_fol . "/files/attach/" . $types . "/" . $file_obj->module_srl . "/" . $file_obj->upload_target_srl . "/" . Context::get("file_srl");
$buff = FileHandler::getRemoteResource($url, null, 3, 'GET', "image/png");
header("Cache-Control: ");
header("Pragma: ");
$t = "application/octet-stream";
header("Content-Type: " . $t);
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-Length: " .sizeof($buff));
header('Content-Disposition: attachment; filename="'.$file_obj->source_filename.'"');
header("Content-Transfer-Encoding: binary\n");
echo $buff;
exit();
}
info.xml
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">외부 첨부파일 애드온</title>
<description xml:lang="ko">
첨부파일을 외부로 업로드 시키는 애드온입니다.
</description>
<version>0.0.3</version>
<date>2015-06-16</date>
<author email_address="xhpichan@gmail.com" link="http://www.luacast.io/">
<name xml:lang="ko">LuaCast</name>
</author>
<extra_vars>
<var name="upload">
<title xml:lang="ko">업로드 서버</title>
<description xml:lang="ko">외부 서버의 도메인 주소를 입력해 주세요. ( 예시 - 도메인 )</description>
</var>
<var name="upload_fol">
<title xml:lang="ko">업로드 폴더</title>
<description xml:lang="ko">외부 서버에 업로드 될 폴더 명을 입력해 주세요. ( 예시 - upload )</description>
</var>
<var name="secret">
<title xml:lang="ko">비밀 키</title>
<description xml:lang="ko">외부 서버에 인증을 위한 비밀 키를 입력해 주세요. ( 예시 - HFRmnQ9hTNGZvFQq )</description>
</var>
</extra_vars>
</addon>
<addon version="0.2">
<title xml:lang="ko">외부 첨부파일 애드온</title>
<description xml:lang="ko">
첨부파일을 외부로 업로드 시키는 애드온입니다.
</description>
<version>0.0.3</version>
<date>2015-06-16</date>
<author email_address="xhpichan@gmail.com" link="http://www.luacast.io/">
<name xml:lang="ko">LuaCast</name>
</author>
<extra_vars>
<var name="upload">
<title xml:lang="ko">업로드 서버</title>
<description xml:lang="ko">외부 서버의 도메인 주소를 입력해 주세요. ( 예시 - 도메인 )</description>
</var>
<var name="upload_fol">
<title xml:lang="ko">업로드 폴더</title>
<description xml:lang="ko">외부 서버에 업로드 될 폴더 명을 입력해 주세요. ( 예시 - upload )</description>
</var>
<var name="secret">
<title xml:lang="ko">비밀 키</title>
<description xml:lang="ko">외부 서버에 인증을 위한 비밀 키를 입력해 주세요. ( 예시 - HFRmnQ9hTNGZvFQq )</description>
</var>
</extra_vars>
</addon>
보노보노
Lv. 2
댓글 4
https://xe1.xpressengine.com/forum/23063012
작동이 안된다는 댓글이 많은데...
다만 작성자분이 배우시는 입장이고 시간이 없으셔서 관리를 잘 안하시는데 오해도 많이 사시고 해서, 떠나시다 시피 한것같아요.
작동되던걸 확인하고 운영하던 사이트에선 꺼뒀는데 여기 글에 위화감이 들어서 다시 한 번 켜봤는데 저도 업로드가 안되네요..
버전업하면서 뭔가 문제가 생긴게 아닌가 싶습니다..분명한건 제것은 1.8.11 이전버전이라서 이후버전의 치명적인 보안이슈 관련한 문제는 아닌거같네요
그래서 말나온 김에 나름 조사를 해 봤네요
우선 첨부파일기능이다보니..
1 이미지프로세스모듈처럼 첨부물에 편집을 다루는 모듈이랑 간섭이 있는 모양입니다. 그래서 이미지프로세스 대상이 되는 파일은 업로드는되는데 정상적으로 화면출력이 안되네요
2 사이트에서 해당 서버 첨부물을 불러오질 못하고 있는 이유는 잘 모르겠습니다..
3 음..그리고 확신하지 못하겠는 부분은
완전히 첨부파일이 외부서버로 독립되었는지 잘 모르겠습니다. 관리자페이지에서 콘텐츠/파일경로로 확인해보면 첨부물의 썸네일은 코어의 files폴더에 작게 지정되고 있는걸로봐서 코어도 해당 파일의 일부분?을 가지고 있는것같은데...
캠핑님은 저보다 더 잘아시니 뭔가 단서를 얻으시리라 생각합니다 ^^