메뉴 건너뛰기

xe 1.7.3.4 Zend Gdata - function insertFile() code - 피카사를 이용한 파일 업로드 튜닝 코드

Average Rating:
 0명 참여
Rate this page:
평점 한줄평 글쓴이 작성날짜


picasa_upload.PNG

 

 

 

xe/modules/file/file.controller.pnp  (xe 1.7.3.4)

 570번째 줄을 아래와 같이 수정 또는 통째로 덮어쓰기

 function insertFile($file_info, $module_srl, $upload_target_srl, $download_count = 0, $manual_insert = false)
 {
  // Call a trigger (before)
  $trigger_obj->module_srl = $module_srl;
  $trigger_obj->upload_target_srl = $upload_target_srl;
  $output = ModuleHandler::triggerCall('file.insertFile', 'before', $trigger_obj);
  if(!$output->toBool()) return $output;

  // A workaround for Firefox upload bug
  if(preg_match('/^=\?UTF-8\?B\?(.+)\?=$/i', $file_info['name'], $match))
  {
   $file_info['name'] = base64_decode(strtr($match[1], ':', '/'));
  }

  //피카사를 위해 2개의 변수 정의
  //$oFileModel = &getModel('file');
        //$config = $oFileModel->getFileConfig($module_srl);
  //정의 끝
   
  if(!$manual_insert)
  {
   // Get the file configurations
   $logged_info = Context::get('logged_info');
   if($logged_info->is_admin != 'Y')
   {
    $oFileModel = &getModel('file');
    $config = $oFileModel->getFileConfig($module_srl);
    $allowed_filesize = $config->allowed_filesize * 1024 * 1024;
    $allowed_attach_size = $config->allowed_attach_size * 1024 * 1024;
    // An error appears if file size exceeds a limit
    if($allowed_filesize < filesize($file_info['tmp_name'])) return new Object(-1, 'msg_exceeds_limit_size');
    // Get total file size of all attachements (from DB)
    $size_args->upload_target_srl = $upload_target_srl;
    $output = executeQuery('file.getAttachedFileSize', $size_args);
    $attached_size = (int)$output->data->attached_size + filesize($file_info['tmp_name']);
    if($attached_size > $allowed_attach_size) return new Object(-1, 'msg_exceeds_limit_size');
   }
  }

  // 피카사 이미지 게시글을 이동할 때는 files DB 내용만 수정
  // 이미지 파일은 피카사로, 일반 파일은 호스팅 서버로 업로드
  // Set upload path by checking if the attachement is an image or other kinds of file
      
  //피카사에 올린 그림파일일 경우(게시글 이동할 때 첨부파일 정보 변경) 
  if(strpos($file_info['tmp_name'], "https://lh") !== false)
  {
          // List file information
            $args->file_srl = getNextSequence();//변화
            
          //$args->upload_target_srl = $upload_target_srl; //그대로
            $args->module_srl = $module_srl;
          //$args->direct_download = 'Y';
          //$args->source_filename = $file_info['name'];
          //$args->source_filename = print_r($picasa_uploaded_info);
          $args->uploaded_filename = $file_info['tmp_name']; //비교값
          //$args->uploaded_filename = $picasa_uploaded_info[0];
          //$args->download_count = $download_count;
          //$args->file_size = $file_info['size']; //@filesize($file_info['tmp_name']);//(int)$picasa_uploaded_info[3];// "30000";//@filesize($filename);
          // xe/modules/file/queries/updateFile_picasa.xml 을 이용하여 files DB 수정
           $output = executeQuery('file.updateFile_picasa', $args);

          //$upload_target_srl
            $_SESSION['__XE_UPLOADING_FILES_INFO__'][$args->file_srl] = true;

          //$output->add('file_srl', $args->file_srl);
          //$output->add('upload_target_srl', $upload_target_srl);
          //$upload_target_type
            //$output->add('sid', $args->sid);
           //$output->module_srl
          //$output->member_srl
           //$output->download_count
            //$output->add('direct_download', $args->direct_download);
            //$output->add('source_filename', $args->source_filename);
            $output->add('uploaded_filename', $args->uploaded_filename);
            //$output->add('file_size',  $args->file_size); //$picasa_uploaded_info[3]);//
            //$output->comment
            //$output->isvalid
            //$output->regdate
            //$output->ipaddress   

            return $output;
  }
  // 이미지 파일은 피카사로 업로드한다.
  elseif(preg_match("/\.(jpe?g|gif|png|bmp|jpg)$/i", $file_info['name']))
  {
   // Immediately remove the direct file if it has any kind of extensions for hacking
   $file_info['name'] = preg_replace('/\.(php|phtm|html?|cgi|pl|exe|jsp|asp|inc)/i', '$0-x',$file_info['name']);
   $file_info['name'] = str_replace(array('<','>'),array('%3C','%3E'),$file_info['name']);

   $path = sprintf("./files/attach/images/%s/%s", $module_srl,getNumberingPath($upload_target_srl,3));

   // special character to '_'
   // change to md5 file name. because window php bug. window php is not recognize unicode character file name - by cherryfilter
   $ext = substr(strrchr($file_info['name'],'.'),1);
   //$_filename = preg_replace('/[#$&*?+%"\']/', '_', $file_info['name']);
   $_filename = md5(crypt(rand(1000000,900000), rand(0,100))).'.'.$ext;
   $filename  = $path.$_filename;
   $idx = 1;
   while(file_exists($filename))
   {
    $filename = $path.preg_replace('/\.([a-z0-9]+)$/i','_'.$idx.'.$1',$_filename);
    $idx++;
   }
   $direct_download = 'Y';
   
       
   //////////////////////////////////////////////////
   //$fn = $_SERVER['DOCUMENT_ROOT']."/tmp/photo.jpg";
   //위의 내용은 파일이 저장될 장소와 이름만을 정의함
   //파일이 삽입되는 시점에 피카사에 같이 업로드 한다.
   //이미 파일은 템프로 서버에 저장된 상태임.
   
   $fn = $file_info['tmp_name'];// 임시폴더에 업로드된 이미지 파일
   $fname = $file_info['name']; // 파일의 이름
   //$album_title = $module_srl."/".getNumberingPath($upload_target_srl,3);
   //$picasa_info = upload_picasa($fn, $config->picasa_id, $config->picasa_pw, $fname, $album_title);
   
   //
   //$picasa_uploaded_info[0] : 이미지 실제 주소
   //$picasa_uploaded_info[1] : 앨범 아이디
   //$picasa_uploaded_info[2] : 이미지 너비 : 썸네일 생성에 사용 sxx 부분을 replace 해서 작은 이미지를 불러오게 함.
   //$picasa_uploaded_info[3] : 이미지 사이즈
   //
   //$picasa_uploaded_info = upload_picasa($fn, $config->picasa_id, $config->picasa_pw, $fname, $module_srl,$upload_target_srl);
   $picasa_uploaded_info = upload_picasa($fn, id@google.com, "password", $fname, $module_srl,$upload_target_srl);
   
   ///////////////////////////////////////////////////    
   //echo '<script type="text/javascript">alert('.print_r($picasa_uploaded_info).')<//script>';
   
   // Get member information
            $oMemberModel = &getModel('member');
            $member_srl = $oMemberModel->getLoggedMemberSrl();
             
   // List file information
            $args->file_srl = getNextSequence();
            $args->upload_target_srl = $upload_target_srl;
            $args->module_srl = $module_srl;
          $args->direct_download = $direct_download;
          $args->source_filename = $file_info['name'];
   //$args->source_filename = print_r($picasa_uploaded_info);
          //$args->uploaded_filename = $filename;
          $args->uploaded_filename = $picasa_uploaded_info[0];
          $args->download_count = $download_count;
          $args->file_size = $file_info['size']; //@filesize($file_info['tmp_name']);//(int)$picasa_uploaded_info[3];// "30000";//@filesize($filename);
           $args->comment = $picasa_uploaded_info[2]; //이미지 높이-후에 이값을 제거하고 s72 를 대입하여 썸네일 원본 파일로 쓰임 //NULL; //"link";
    
          $args->member_srl = $member_srl;
           //$args->sid = md5(rand(rand(1111111,4444444),rand(4444445,9999999)));
   $args->sid = $picasa_uploaded_info[1];
            $output = executeQuery('file.insertFile', $args);

            if(!$output->toBool()) return $output;

            // Call a trigger (after)
            $trigger_output = ModuleHandler::triggerCall('file.insertFile', 'after', $args);
            if(!$trigger_output->toBool()) return $trigger_output;

   $_SESSION['__XE_UPLOADING_FILES_INFO__'][$args->file_srl] = true;

         $output->add('file_srl', $args->file_srl);
         $output->add('file_size',  $args->file_size); //$picasa_uploaded_info[3]);//
            $output->add('sid', $args->sid);
            $output->add('direct_download', $args->direct_download);
            $output->add('source_filename', $args->source_filename);
            $output->add('upload_target_srl', $upload_target_srl);
            $output->add('uploaded_filename', $args->uploaded_filename);
   
    
   //템프 파일 자체를 지워버림
   FileHandler::removeFile($file_info['tmp_name']);
   
            return $output;
  }
  
  // 일반 파일의 경우는 기존의 업로드 방식을 따른다.  
  else {
   if(preg_match("/\.(wm[va]|mpe?g|avi|swf|flv|mp[1-4]|as[fx]|wav|midi?|moo?v|qt|r[am]{1,2}|m4v)$/i", $file_info['name'])) {
    // Immediately remove the direct file if it has any kind of extensions for hacking
    $file_info['name'] = preg_replace('/\.(php|phtm|html?|cgi|pl|exe|jsp|asp|inc)/i', '$0-x',$file_info['name']);
    $file_info['name'] = str_replace(array('<','>'),array('%3C','%3E'),$file_info['name']);

    $path = sprintf("./files/attach/images/%s/%s", $module_srl,getNumberingPath($upload_target_srl,3));

    // special character to '_'
    // change to md5 file name. because window php bug. window php is not recognize unicode character file name - by cherryfilter
    $ext = substr(strrchr($file_info['name'],'.'),1);
    //$_filename = preg_replace('/[#$&*?+%"\']/', '_', $file_info['name']);
    $_filename = md5(crypt(rand(1000000,900000), rand(0,100))).'.'.$ext;
    $filename  = $path.$_filename;
    $idx = 1;
    while(file_exists($filename))
    {
     $filename = $path.preg_replace('/\.([a-z0-9]+)$/i','_'.$idx.'.$1',$_filename);
     $idx++;
    }
    $direct_download = 'Y';
   }
   else
   {
    $path = sprintf("./files/attach/binaries/%s/%s", $module_srl, getNumberingPath($upload_target_srl,3));
    $filename = $path.md5(crypt(rand(1000000,900000), rand(0,100)));
    $direct_download = 'N';
   }
  }
  
  
  // Create a directory
  if(!FileHandler::makeDir($path)) return new Object(-1,'msg_not_permitted_create');
  // Move the file
  if($manual_insert)
  {
   @copy($file_info['tmp_name'], $filename);
   if(!file_exists($filename))
   {
    $filename = $path. md5(crypt(rand(1000000,900000).$file_info['name'])).'.'.$ext;
    @copy($file_info['tmp_name'], $filename);
   }
  }
  else
  {
   if(!@move_uploaded_file($file_info['tmp_name'], $filename))
   {
    $filename = $path. md5(crypt(rand(1000000,900000).$file_info['name'])).'.'.$ext;
    if(!@move_uploaded_file($file_info['tmp_name'], $filename))  return new Object(-1,'msg_file_upload_error');
   }
  }
  
  // Get member information
  $oMemberModel = &getModel('member');
  $member_srl = $oMemberModel->getLoggedMemberSrl();
  // List file information
  $args->file_srl = getNextSequence();
  $args->upload_target_srl = $upload_target_srl;
  $args->module_srl = $module_srl;
  $args->direct_download = $direct_download;
  $args->source_filename = $file_info['name'];
  $args->uploaded_filename = $filename;
  $args->download_count = $download_count;
  $args->file_size = @filesize($filename);
  $args->comment = NULL;
  $args->member_srl = $member_srl;
  $args->sid = md5(rand(rand(1111111,4444444),rand(4444445,9999999)));

  $output = executeQuery('file.insertFile', $args);
  if(!$output->toBool()) return $output;
  // Call a trigger (after)
  $trigger_output = ModuleHandler::triggerCall('file.insertFile', 'after', $args);
  if(!$trigger_output->toBool()) return $trigger_output;

  $_SESSION['__XE_UPLOADING_FILES_INFO__'][$args->file_srl] = true;

  $output->add('file_srl', $args->file_srl);
  $output->add('file_size', $args->file_size);
  $output->add('sid', $args->sid);
  $output->add('direct_download', $args->direct_download);
  $output->add('source_filename', $args->source_filename);
  $output->add('upload_target_srl', $upload_target_srl);
  $output->add('uploaded_filename', $args->uploaded_filename);
  return $output;
 }

 

 

xe/modules/file/file.controller.pnp

파일 끝에 추가

 zend gdata 를 이용하여 picasa 에 파일 올리는 코드

//앨범 이름에 슬래쉬를 넣어서 제대로 안됨 ㅡ.ㅡ;;;
function get_albumidxx($user, $pass, $album_title, $gp) {
 // 피드 URL을 만든다.
    $feedURL = "http://picasaweb.google.com/data/feed/api/user/
    $user/album/$album_title";
    $myFile = "testFilex.txt";
    $fh = fopen($myFile, 'w') or die("can't open file");
    $stringData = print_r($feedURL, true);
    fwrite($fh, $stringData);
    fclose($fh);
    // SimpleXML 객체로 피드를 읽는다.
    $sxml = simplexml_load_file($feedURL);
  
    // 앨범 이름과 사진 개수를 얻는다.
    $counts = $sxml->children('http://a9.com/-/spec/opensearchrss/1.0/');
    $total = $counts->totalResults;

 
 if($total > 0) {
  foreach ($sxml->entry as $entry) {
      $myFile = "testFile.txt";
      $fh = fopen($myFile, 'w') or die("can't open file");
      $stringData = print_r($sxml->entry, true);
      fwrite($fh, $stringData);
      fclose($fh);
        $title = $entry->title;
        $summary = $entry->summary;
     
        $gphoto = $entry->children('http://schemas.google.com/photos/2007');
        $size = $gphoto->size;
        $height = $gphoto->height;
        $width = $gphoto->width;
     
        $media = $entry->children('http://search.yahoo.com/mrss/');
        $thumbnail = $media->group->thumbnail[1];
        $tags = $media->group->keywords;
     
        echo "<h2>$summary</h2>\n";
        echo "<table><tr><td><img src=\"" . $thumbnail->attributes()->{'url'} . "\"/></td>\n";
        echo "<td><span class=\"attr\">File</span>: $title <br />\n";
        echo "<span class=\"attr\">Size</span>: $size ($height x $width) <br />\n";
        echo "<span class=\"attr\">Tags</span>: $tags </td></tr></table>\n";
  }
 }
}
 
//
//앨범의 '제목'으로 앨범 '아이디' 값을 구함
//
function get_albumid($user, $pass, $album_title, $gp) {
 /*ini_set("include_path", '/home2/samon:' . ini_get("include_path")  );
 require_once 'Zend/Loader.php';
 Zend_Loader::loadClass('Zend_Gdata_Photos');
 Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
 Zend_Loader::loadClass('Zend_Gdata_AuthSub');
             
 $serviceName = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
 $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $serviceName);

 // update the second argument to be CompanyName-ProductName-Version
 $gp = new Zend_Gdata_Photos($client, "Google-DevelopersGuide-1.0");*/
 try {
  $userFeed = $gp->getUserFeed("default");
  //앨범 타이틀이 엔트리의 타이들에 포함되어 있을 경우, 해당 앨범ID를 리턴함
  foreach ($userFeed as $userEntry) {
   if($album_title == $userEntry->title->text) {
    /* //같은 이름을 가진 파일 삭제하여 오버라이트함.
    try {
     //$photo = $gp->getPhotoEntry( 'http://picasaweb.google.com/data/entry/api/user/xxxxx/albumid/yyyyy/photoid/zzzzz');

     //$photos = $gp->getPhotoEntry();
     $myFile = "testFile.txt";
     $fh = fopen($myFile, 'w') or die("can't open file");
     $stringData = print_r($userEntry, true);
     fwrite($fh, $stringData);
     fclose($fh);
     
     foreach($photos as $photo)
      if($photo_fn == $photo->title-text) {
       $photo->delete();           
      }
      } catch (Zend_Gdata_App_Exception $e) {
     
    echo "Error: " . $e->getResponse();
    $myFile = "testFilex.txt";
    $fh = fopen($myFile, 'w') or die("can't open file");
    $stringData = print_r($e, true);
    fwrite($fh, $stringData);
    fclose($fh);
    } */
   
      
    return str_replace('albumid/','',strstr($userEntry->id->text, 'albumid/')); // albumId 리턴
   }      
  }
 } catch (Zend_Gdata_App_HttpException $e) {
     //echo "Error: " . $e->getMessage() . "<br />\n";
     //if ($e->getResponse() != null) {
  // echo "Body: <br />\n" . $e->getResponse()->getBody() . "<br />\n";
  //}
    
     // In new versions of Zend Framework, you also have the option
     // to print out the request that was made.  As the request
     // includes Auth credentials, it's not advised to print out
     // this data unless doing debugging
     // echo "Request: <br />\n" . $e->getRequest() . "<br />\n";
 } catch (Zend_Gdata_App_Exception $e) {
     //echo "Error: " . $e->getMessage() . "<br />\n";
 }
 return NULL;
}
   

function upload_picasa($fn, $user, $pass, $source_filename, $module_srl, $upload_target_srl) {
 //xe files/images/ 폴더에 저장되는 실제 폴더를 피카사에도 통일함
 $album_title = $module_srl."/".getNumberingPath($upload_target_srl,3);
 //피카사 업로드 시작
 ini_set("include_path", '/home2/samon:' . ini_get("include_path")  );
 require_once 'Zend/Loader.php';
 Zend_Loader::loadClass('Zend_Gdata_Photos');
 Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
 Zend_Loader::loadClass('Zend_Gdata_AuthSub');

 //config값 아이디와 암호불러오기
 $serviceName = Zend_Gdata_Photos::AUTH_SERVICE_NAME;
 //$user = $config->picasa_id;
 //$pass = $config->picasa_pw;
 try {
  $httpClient = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $serviceName);
  $gp = new Zend_Gdata_Photos($httpClient, "Google-DevelopersGuide-1.0");
 } catch(Zend_Gdata_App_Exception $e) {
  die("ERROR : Cannot connect to youtube<hr/>" . $e->getResponse());
 }
   
 $username = "default";
 $photoName = $source_filename;
 //피카사의 해당 이미지에 실제 이미지 올린 글을 링크하도록 캡션(제목)을 달아 줌
 $photoCaption = "http://1sam.ruatic.net/".$upload_target_srl;
 $photoTags = "XE, 1Samonline, 일쌤온라인";
 //$albumId = "5836285696291714177";
 //$albumID = "default";   
 //$fn = $_SERVER['DOCUMENT_ROOT']."/tmp/photo.jpg"; //성공
 //$fn = $file_info['name'];

 //두번째 파일이 같은 앨범에 들어가도록 앨범 아이디 검색
 //두번의 로그인을 하지 않도록 $gp를 넘겨줌
 $albumId = get_albumid($user, $pass, $album_title, $gp);
   
 //$photoCaption = $albumId;
   
 if ($albumId == NULL) {
  //Add an Album
  $albumentry = new Zend_Gdata_Photos_AlbumEntry();
  $albumentry->setTitle($gp->newTitle($album_title));
  $albumentry->setSummary($gp->newSummary($albumId));
  //$albumentry->setGphotoAccess($gp->newAccess("public")); //공유가능
  $albumentry->setGphotoAccess($gp->newAccess("private")); //공유불능
   
  $createdEntry = $gp->insertAlbumEntry($albumentry);
      
  // Get Albumid
  //$albumId = $createdEntry->albumId->getText;
  //$albumId = $createdEntry->getGphotoAlbumId()->text;
  //$photoCaption = $createdEntry->Id->text; //앨범의 주소 포함 https://picasaweb.google.com/data/entry/api/user/108515335692917089918/albumid/5836891111203540929
  $albumId = str_replace('albumid/','',strstr($createdEntry->Id->text, 'albumid/'));
 }

 // We use the AlbumQuery class to generate the URL for the album
 $albumQuery = $gp->newAlbumQuery();
 $albumQuery->setUser($username);
 //$albumQuery->setTitle("Album Test Tile");//포토 올릴 때는 오류
 //$albumQuery->setSummary("test album");// 포토 올릴 때는 오류
 $albumQuery->setAlbumId($albumId);
     
 //$albumEntry = $gp->newAlbumEntry();
 //$albumentry->setTitle($gp->newTitle("New album"));
 //$albumentry->setSummary($gp->newSummary("This is an album."));
 //$insertedalbumEntry = $gp->insertAlbumEntry($albumEntry);
  
 $fd = $gp->newMediaFileSource($fn);
 $fd->setContentType("image/jpeg");
   
 // Create a PhotoEntry
 $photoEntry = $gp->newPhotoEntry();
 $photoEntry->setMediaSource($fd);
 $photoEntry->setTitle($gp->newTitle($photoName));
 $photoEntry->setSummary($gp->newSummary($photoCaption));
  
 // add some tags
 $keywords = new Zend_Gdata_Media_Extension_MediaKeywords();
 $keywords->setText($photoTags);
 $photoEntry->mediaGroup = new Zend_Gdata_Media_Extension_MediaGroup();
 $photoEntry->mediaGroup->keywords = $keywords;
   
 // We insert the photo, and the server returns the entry representing
 // that photo after it is uploaded
 $insertedEntry = $gp->insertPhotoEntry($photoEntry, $albumQuery->getQueryUrl());

 //가로가 크면 가로를 보냄
 if( $insertedEntry->getGphotoWidth()->text > $insertedEntry->getGphotoHeight()->text) {
  $val_s = "s".$insertedEntry->getGphotoWidth();
 } else {
  $val_s = "s".$insertedEntry->getGphotoHeight();
 }

 $url = str_replace('/s72/', "/".$val_s."/", $insertedEntry->getMediaGroup()->Thumbnail[0]->url);
   
 $size = $insertedEntry->getGphotoSize();
  
 //리턴할 이미지의 주소, 앨범 아이디, 이미지 높이,사이즈 -  /s72/를 height로 수정
 $picasa_uploaded_info = array ($url, $albumId, $val_s, $size);

 //피카사 업로드 끝
   
 //return $insertedEntry;
 return $picasa_uploaded_info;
}

 


 xe/modules/file/queries/updateFile_picasa.xml

게시글 이동시에 첨부 파일이 피카사 이미지인 경우, uploaded_filename 으로 파일 DB를 검색하여 file_srl과 module_srl 만 수정해 준다.

<query id="updateFile_picasa" action="update">
    <tables>
        <table name="files" />
    </tables>
    <columns>
  <column name="file_srl" var="file_srl" notnull="notnull" />
        <column name="module_srl" var="module_srl" filter="number" notnull="notnull" />
    </columns>
    <conditions>
        <condition operation="equal" column="uploaded_filename" var="uploaded_filename" notnull="notnull" />
    </conditions>
</query>


수정전 DB

db_files.PNG

 

수정후 DB

db_files2.PNG

  • http://1sam.kr/2383



    위의 팁을 꼭 참조해야 합니다.
  • 이거 소스 복사 넣기만 하면 가능한 건가요?
    서버 세팅이나 피카사 아이디, 인증키 같은 거 넣거나 안 해도 되나요?
  • 유료버전으로 제작하여 배포할 예정입니다.
제목 날짜
Star Rating 별점 위젯 업데이트 정보   2014.03.09
Bootstrap Menu templetes   file
    9
Font Awesome   file
    9
플레시 메뉴 layout 원본  
    8
태그 목록