Changeset 12906


Ignore:
Timestamp:
01/17/12 01:11:14 (8 years ago)
Author:
plg
Message:

feature 2548 (multiple sizes): adapt the web API method pwg.images.add (used
by pLoader, Digikam, Lightroom, iPhoto), pwg.images.checkFiles (pLoader only).

The "resize" parameter was removed for pwg.images.add since this behavior
becomes the default behavior in Piwigo 2.4.

Just like pwg.images.addSimple, pwg.images.add now uses the add_uploaded_file
function (next step is to merge pwg.images.add and pwg.images.addSimple)

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/admin/include/functions.php

    r12875 r12906  
    23082308  } 
    23092309} 
     2310 
     2311function delete_element_derivatives($ids) 
     2312{ 
     2313  // todo 
     2314  if (!is_array($ids)) 
     2315  { 
     2316    $ids = array($ids); 
     2317  } 
     2318 
     2319  // for now I do a massive clear, to be removed once the function is 
     2320  // properly implemented 
     2321  clear_derivative_cache(); 
     2322} 
    23102323?> 
  • trunk/admin/include/functions_upload.inc.php

    r12879 r12906  
    151151} 
    152152 
    153 function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null, $image_id=null) 
     153function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null, $image_id=null, $original_md5sum=null) 
    154154{ 
    155155  // 1) move uploaded file to upload/2010/01/22/20100122003814-449ada00.jpg 
     
    164164  global $conf, $user; 
    165165 
    166   $md5sum = md5_file($source_filepath); 
     166  if (isset($original_md5sum)) 
     167  { 
     168    $md5sum = $original_md5sum; 
     169  } 
     170  else 
     171  { 
     172    $md5sum = md5_file($source_filepath); 
     173  } 
     174   
    167175  $file_path = null; 
    168176   
     
    235243  else 
    236244  { 
    237     copy($source_filepath, $file_path); 
     245    rename($source_filepath, $file_path); 
    238246  } 
    239247 
     
    292300      'file' => pwg_db_real_escape_string(isset($original_filename) ? $original_filename : basename($file_path)), 
    293301      'date_available' => $dbnow, 
    294       'tn_ext' => 'jpg', 
    295302      'path' => preg_replace('#^'.preg_quote(PHPWG_ROOT_PATH).'#', '', $file_path), 
    296303      'filesize' => $file_infos['filesize'], 
     
    300307      'added_by' => $user['id'], 
    301308      ); 
    302  
    303     if (isset($high_infos)) 
    304     { 
    305       $insert['has_high'] = 'true'; 
    306       $insert['high_filesize'] = $high_infos['filesize']; 
    307       $insert['high_width'] = $high_infos['width']; 
    308       $insert['high_height'] = $high_infos['height']; 
    309     } 
    310  
     309     
    311310    if (isset($level)) 
    312311    { 
  • trunk/include/ws_functions.inc.php

    r12865 r12906  
    14321432  global $conf; 
    14331433 
    1434   ws_logfile('[ws_images_add_chunk] welcome'); 
    14351434  // data 
    14361435  // original_sum 
     
    15701569} 
    15711570 
     1571/** 
     1572 * Function introduced for Piwigo 2.4 and the new "multiple size" 
     1573 * (derivatives) feature. As we only need the biggest sent photo as 
     1574 * "original", we remove chunks for smaller sizes. We can't make it earlier 
     1575 * in ws_images_add_chunk because at this moment we don't know which $type 
     1576 * will be the biggest (we could remove the thumb, but let's use the same 
     1577 * algorithm) 
     1578 */ 
     1579function remove_chunks($original_sum, $type) 
     1580{ 
     1581  global $conf; 
     1582 
     1583  $upload_dir = $conf['upload_dir'].'/buffer'; 
     1584  $pattern = '/'.$original_sum.'-'.$type.'/'; 
     1585  $chunks = array(); 
     1586 
     1587  if ($handle = opendir($upload_dir)) 
     1588  { 
     1589    while (false !== ($file = readdir($handle))) 
     1590    { 
     1591      if (preg_match($pattern, $file)) 
     1592      { 
     1593        array_push($chunks, $upload_dir.'/'.$file); 
     1594      } 
     1595    } 
     1596    closedir($handle); 
     1597  } 
     1598 
     1599  foreach ($chunks as $chunk) 
     1600  { 
     1601    unlink($chunk); 
     1602  } 
     1603} 
     1604 
    15721605/* 
    15731606 * The $file_path must be the path of the basic "web sized" photo 
     
    15781611  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php'); 
    15791612 
    1580   $file_path = file_path_for_type($file_path, $type); 
    1581  
    15821613  $upload_dir = dirname($file_path); 
    15831614  if (substr(PHP_OS, 0, 3) == 'WIN') 
     
    16111642  secure_directory($upload_dir); 
    16121643 
    1613   // merge the thumbnail 
     1644  // merge the file 
    16141645  merge_chunks($file_path, $original_sum, $type); 
    16151646  chmod($file_path, 0644); 
     
    16341665function ws_images_addFile($params, &$service) 
    16351666{ 
     1667  ws_logfile(__FUNCTION__.', input :  '.var_export($params, true)); 
    16361668  // image_id 
    16371669  // type {thumb, file, high} 
    1638   // sum 
     1670  // sum -> not used currently (Piwigo 2.4) 
    16391671 
    16401672  global $conf; 
     
    16511683 
    16521684  // 
    1653   // what is the path? 
     1685  // what is the path and other infos about the photo? 
    16541686  // 
    16551687  $query = ' 
    16561688SELECT 
    16571689    path, 
    1658     md5sum 
     1690    file, 
     1691    md5sum, 
     1692    width, 
     1693    height, 
     1694    filesize 
    16591695  FROM '.IMAGES_TABLE.' 
    16601696  WHERE id = '.$params['image_id'].' 
    16611697;'; 
    1662   list($file_path, $original_sum) = pwg_db_fetch_row(pwg_query($query)); 
    1663  
    1664   // TODO only files added with web API can be updated with web API 
    1665  
    1666   // 
    1667   // makes sure directories are there and call the merge_chunks 
    1668   // 
    1669   $infos = add_file($file_path, $params['type'], $original_sum, $params['sum']); 
    1670  
    1671   // 
    1672   // update basic metadata from file 
    1673   // 
    1674   $update = array(); 
    1675  
     1698  $image = pwg_db_fetch_assoc(pwg_query($query)); 
     1699 
     1700  if ($image == null) 
     1701  { 
     1702    return new PwgError(404, "image_id not found"); 
     1703  } 
     1704 
     1705  // since Piwigo 2.4 and derivatives, we do not take the imported "thumb" 
     1706  // into account 
     1707  if ('thumb' == $params['type']) 
     1708  { 
     1709    remove_chunks($image['md5sum'], $type); 
     1710    return true; 
     1711  } 
     1712 
     1713  // since Piwigo 2.4 and derivatives, we only care about the "original" 
     1714  $original_type = 'file'; 
    16761715  if ('high' == $params['type']) 
    16771716  { 
    1678     $update['high_filesize'] = $infos['filesize']; 
    1679     $update['high_width'] = $infos['width']; 
    1680     $update['high_height'] = $infos['height']; 
    1681     $update['has_high'] = 'true'; 
    1682   } 
    1683  
     1717    $original_type = 'high'; 
     1718  } 
     1719 
     1720  $file_path = $conf['upload_dir'].'/buffer/'.$image['md5sum'].'-original'; 
     1721 
     1722  merge_chunks($file_path, $image['md5sum'], $original_type); 
     1723  chmod($file_path, 0644); 
     1724 
     1725  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php'); 
     1726 
     1727  // if we receive the "file", we only update the original if the "file" is 
     1728  // bigger than current original 
    16841729  if ('file' == $params['type']) 
    16851730  { 
    1686     $update['filesize'] = $infos['filesize']; 
    1687     $update['width'] = $infos['width']; 
    1688     $update['height'] = $infos['height']; 
    1689   } 
    1690  
    1691   // we may have nothing to update at database level, for example with a 
    1692   // thumbnail update 
    1693   if (count($update) > 0) 
    1694   { 
    1695     $update['id'] = $params['image_id']; 
    1696  
    1697     include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); 
    1698     mass_updates( 
    1699       IMAGES_TABLE, 
    1700       array( 
    1701         'primary' => array('id'), 
    1702         'update'  => array_diff(array_keys($update), array('id')) 
    1703         ), 
    1704       array($update) 
    1705       ); 
    1706   } 
     1731    $do_update = false; 
     1732     
     1733    $infos = pwg_image_infos($file_path); 
     1734     
     1735    foreach (array('width', 'height', 'filesize') as $image_info) 
     1736    { 
     1737      if ($infos[$image_info] > $image[$image_info]) 
     1738      { 
     1739        $do_update = true; 
     1740      } 
     1741    } 
     1742 
     1743    if (!$do_update) 
     1744    { 
     1745      unlink($file_path); 
     1746      return true; 
     1747    } 
     1748  } 
     1749 
     1750  $image_id = add_uploaded_file( 
     1751    $file_path, 
     1752    $image['file'], 
     1753    null, 
     1754    null, 
     1755    $params['image_id'], 
     1756    $image['md5sum'] // we force the md5sum to remain the same 
     1757    ); 
     1758 
     1759  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); 
     1760  delete_element_derivatives($params['image_id']); 
    17071761} 
    17081762 
     
    17491803  } 
    17501804 
    1751   if ($params['resize']) 
    1752   { 
    1753     ws_logfile('[pwg.images.add] resize activated'); 
    1754  
    1755     // temporary file path 
    1756     $type = 'file'; 
    1757     $file_path = $conf['upload_dir'].'/buffer/'.$params['original_sum'].'-'.$type; 
    1758  
    1759     merge_chunks($file_path, $params['original_sum'], $type); 
    1760     chmod($file_path, 0644); 
    1761  
    1762     include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php'); 
    1763  
    1764     $image_id = add_uploaded_file( 
    1765       $file_path, 
    1766       $params['original_filename'] 
    1767       ); 
    1768  
    1769     // add_uploaded_file doesn't remove the original file in the buffer 
    1770     // directory if it was not uploaded as $_FILES 
    1771     unlink($file_path); 
     1805  // due to the new feature "derivatives" (multiple sizes) introduced for 
     1806  // Piwigo 2.4, we only take the biggest photos sent on 
     1807  // pwg.images.addChunk. If "high" is available we use it as "original" 
     1808  // else we use "file". 
     1809  remove_chunks($params['original_sum'], 'thumb'); 
     1810   
     1811  if (isset($params['high_sum'])) 
     1812  { 
     1813    $original_type = 'high'; 
     1814    remove_chunks($params['original_sum'], 'file'); 
    17721815  } 
    17731816  else 
    17741817  { 
    1775     // current date 
    1776     list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();')); 
    1777     list($year, $month, $day) = preg_split('/[^\d]/', $dbnow, 4); 
    1778  
    1779     // upload directory hierarchy 
    1780     $upload_dir = sprintf( 
    1781       $conf['upload_dir'].'/%s/%s/%s', 
    1782       $year, 
    1783       $month, 
    1784       $day 
    1785       ); 
    1786  
    1787     // compute file path 
    1788     $date_string = preg_replace('/[^\d]/', '', $dbnow); 
    1789     $random_string = substr($params['file_sum'], 0, 8); 
    1790     $filename_wo_ext = $date_string.'-'.$random_string; 
    1791     $file_path = $upload_dir.'/'.$filename_wo_ext.'.jpg'; 
    1792  
    1793     // add files 
    1794     $file_infos  = add_file($file_path, 'file',  $params['original_sum'], $params['file_sum']); 
    1795     $thumb_infos = add_file($file_path, 'thumb', $params['original_sum'], $params['thumbnail_sum']); 
    1796  
    1797     if (isset($params['high_sum'])) 
    1798     { 
    1799       $high_infos = add_file($file_path, 'high', $params['original_sum'], $params['high_sum']); 
    1800     } 
    1801  
    1802     // database registration 
    1803     $insert = array( 
    1804       'file' => !empty($params['original_filename']) ? $params['original_filename'] : $filename_wo_ext.'.jpg', 
    1805       'date_available' => $dbnow, 
    1806       'tn_ext' => 'jpg', 
    1807       'name' => $params['name'], 
    1808       'path' => $file_path, 
    1809       'filesize' => $file_infos['filesize'], 
    1810       'width' => $file_infos['width'], 
    1811       'height' => $file_infos['height'], 
    1812       'md5sum' => $params['original_sum'], 
    1813       'added_by' => $user['id'], 
    1814       ); 
    1815  
    1816     if (isset($params['high_sum'])) 
    1817     { 
    1818       $insert['has_high'] = 'true'; 
    1819       $insert['high_filesize'] = $high_infos['filesize']; 
    1820       $insert['high_width'] = $high_infos['width']; 
    1821       $insert['high_height'] = $high_infos['height']; 
    1822     } 
    1823  
    1824     single_insert( 
    1825       IMAGES_TABLE, 
    1826       $insert 
    1827       ); 
    1828  
    1829     $image_id = pwg_db_insert_id(IMAGES_TABLE); 
    1830  
    1831     // update metadata from the uploaded file (exif/iptc) 
    1832     require_once(PHPWG_ROOT_PATH.'admin/include/functions_metadata.php'); 
    1833     sync_metadata(array($image_id)); 
    1834   } 
     1818    $original_type = 'file'; 
     1819  } 
     1820 
     1821  $file_path = $conf['upload_dir'].'/buffer/'.$params['original_sum'].'-original'; 
     1822 
     1823  merge_chunks($file_path, $params['original_sum'], $original_type); 
     1824  chmod($file_path, 0644); 
     1825 
     1826  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php'); 
     1827 
     1828  $image_id = add_uploaded_file( 
     1829    $file_path, 
     1830    $params['original_filename'], 
     1831    null, // categories 
     1832    isset($params['level']) ? $params['level'] : null, 
     1833    null, // image_id 
     1834    $params['original_sum'] 
     1835    ); 
    18351836 
    18361837  $info_columns = array( 
     
    18381839    'author', 
    18391840    'comment', 
    1840     'level', 
    18411841    'date_creation', 
    18421842    ); 
     1843 
     1844  $update = array(); 
    18431845 
    18441846  foreach ($info_columns as $key) 
     
    23392341function ws_images_exist($params, &$service) 
    23402342{ 
     2343  ws_logfile(__FUNCTION__.' '.var_export($params, true)); 
     2344 
    23412345  global $conf; 
    23422346 
     
    24172421function ws_images_checkFiles($params, &$service) 
    24182422{ 
     2423  ws_logfile(__FUNCTION__.', input :  '.var_export($params, true)); 
     2424 
    24192425  if (!is_admin()) 
    24202426  { 
     
    24422448;'; 
    24432449  $result = pwg_query($query); 
    2444   if (pwg_db_num_rows($result) == 0) { 
     2450  if (pwg_db_num_rows($result) == 0) 
     2451  { 
    24452452    return new PwgError(404, "image_id not found"); 
    24462453  } 
     
    24492456  $ret = array(); 
    24502457 
    2451   foreach (array('thumb', 'file', 'high') as $type) { 
    2452     $param_name = $type; 
    2453     if ('thumb' == $type) { 
    2454       $param_name = 'thumbnail'; 
    2455     } 
    2456  
    2457     if (isset($params[$param_name.'_sum'])) { 
    2458       include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php'); 
    2459       $type_path = file_path_for_type($path, $type); 
    2460       if (!is_file($type_path)) { 
    2461         $ret[$param_name] = 'missing'; 
    2462       } 
    2463       else { 
    2464         if (md5_file($type_path) != $params[$param_name.'_sum']) { 
    2465           $ret[$param_name] = 'differs'; 
    2466         } 
    2467         else { 
    2468           $ret[$param_name] = 'equals'; 
    2469         } 
    2470       } 
    2471     } 
    2472   } 
     2458  if (isset($params['thumbnail_sum'])) 
     2459  { 
     2460    // We always say the thumbnail is equal to create no reaction on the 
     2461    // other side. Since Piwigo 2.4 and derivatives, the thumbnails and web 
     2462    // sizes are always generated by Piwigo 
     2463    $ret['thumbnail'] = 'equals'; 
     2464  } 
     2465 
     2466  if (isset($params['high_sum'])) 
     2467  { 
     2468    $ret['file'] = 'equals'; 
     2469    $compare_type = 'high'; 
     2470  } 
     2471  elseif (isset($params['file_sum'])) 
     2472  { 
     2473    $compare_type = 'file'; 
     2474  } 
     2475 
     2476  if (isset($compare_type)) 
     2477  { 
     2478    ws_logfile(__FUNCTION__.', md5_file($path) = '.md5_file($path)); 
     2479    if (md5_file($path) != $params[$compare_type.'_sum']) 
     2480    { 
     2481      $ret[$compare_type] = 'differs'; 
     2482    } 
     2483    else 
     2484    { 
     2485      $ret[$compare_type] = 'equals'; 
     2486    } 
     2487  } 
     2488 
     2489  ws_logfile(__FUNCTION__.', output :  '.var_export($ret, true)); 
    24732490 
    24742491  return $ret; 
  • trunk/ws.php

    r12865 r12906  
    260260        'maxValue' => $conf['available_permission_levels'] 
    261261        ), 
    262       'resize' => array('default' => false), 
    263262      'check_uniqueness' => array('default' => true), 
    264263      ), 
Note: See TracChangeset for help on using the changeset viewer.