Make WordPress Core


Ignore:
Timestamp:
11/01/2005 09:28:03 PM (19 years ago)
Author:
ryan
Message:

wp_handle_upload() and image upload improvements from Andy. fixes #1806

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/image-uploading.php

    r2967 r2979  
    66    die(__('You do not have permission to edit posts.'));
    77
    8 $wpvarstoreset = array('action', 'post', 'all', 'last', 'link', 'sort', 'start', 'imgtitle', 'descr', 'object');
     8$wpvarstoreset = array('action', 'post', 'all', 'last', 'link', 'sort', 'start', 'imgtitle', 'descr', 'object', 'flickrtag');
    99
    1010for ($i=0; $i<count($wpvarstoreset); $i += 1) {
     
    2727
    2828function get_udims($width, $height) {
    29     if ( $height < 96 && $width < 128 )
     29    if ( $height <= 96 && $width <= 128 )
    3030        return array($width, $height);
    3131    elseif ( $width / $height > 4 / 3 )
     
    4545case 'save':
    4646
    47 // Define acceptable image extentions/types here. Tests will apply strtolower().
    48 $exts = array('gif' => IMAGETYPE_GIF, 'jpg' => IMAGETYPE_JPEG, 'png' => IMAGETYPE_PNG);
    49 
    50 // Define the error messages for bad uploads.
    51 $upload_err = array(false,
    52     __("The uploaded file exceeds the <code>upload_max_filesize</code> directive in <code>php.ini</code>."),
    53     __("The uploaded file exceeds the <em>MAX_FILE_SIZE</em> directive that was specified in the HTML form."),
    54     __("The uploaded file was only partially uploaded."),
    55     __("No file was uploaded."),
    56     __("Missing a temporary folder."),
    57     __("Failed to write file to disk."));
    58 
    59 $iuerror = false;
    60 
    61 // Failing any single one of the following tests is fatal.
    62 
    63 // A correct form post will pass this test.
    64 if ( !isset($_POST['action']) || $_POST['action'] != 'save' || count($_FILES) != 1 || ! isset($_FILES['image']) || is_array($_FILES['image']['name']) )
    65     $error = __('Invalid form submission. Only submit approved forms.');
    66 
    67 // A successful upload will pass this test.
    68 elseif ( $_FILES['image']['error'] > 0 )
    69     $error = $upload_err[$_FILES['image']['error']];
    70 
    71 // A non-empty file will pass this test.
    72 elseif ( 0 == $_FILES['image']['size'] )
    73     $error = __('File is empty. Please upload something more substantial.');
    74 
    75 // A correct MIME category will pass this test. Full types are not consistent across browsers.
    76 elseif ( ! 'image/' == substr($_FILES['image']['type'], 0, 6) )
    77     $error = __('Bad MIME type submitted by your browser.');
    78 
    79 // An acceptable file extension will pass this test.
    80 elseif ( ! ( ( 0 !== preg_match('#\.?([^\.]*)$#', $_FILES['image']['name'], $matches) ) && ( $ext = strtolower($matches[1]) ) && array_key_exists($ext, $exts) ) )
    81     $error = __('Bad file extension.');
    82 
    83 // A valid uploaded file will pass this test.
    84 elseif ( ! is_uploaded_file($_FILES['image']['tmp_name']) )
    85     $error = __('Bad temp file. Try renaming the file and uploading again.');
    86 
    87 // A valid image file will pass this test.
    88 elseif ( function_exists('exif_imagetype') && $exts[$ext] != $imagetype = exif_imagetype($_FILES['image']['tmp_name']) )
    89     $error = __('Bad image file. Try again, or try recreating it.');
    90 
    91 // An image with at least one pixel will pass this test.
    92 elseif ( ! ( ( $imagesize = getimagesize($_FILES['image']['tmp_name']) ) && $imagesize[0] > 1 && $imagesize[1] > 1 ) )
    93     $error = __('The image has no pixels. Isn\'t that odd?');
    94 
    95 // A writable uploads dir will pass this test.
    96 elseif ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) )
    97     $error = $uploads['error'];
    98 
    99 if ( $error )
    100     // Something wasn't right. Abort and never touch the temp file again.
    101     die("$error <a href='".basename(__FILE__)."?action=upload&post=$post'>Back to Image Uploading</a>");
    102 
    103 // Increment the file number until we have a unique file to save in $dir
    104 $number = '';
    105 $filename = $_FILES['image']['name'];
    106 while ( file_exists($uploads['path'] . "/$filename") )
    107     $filename = str_replace("$number.$ext", ++$number . ".$ext", $filename);
    108 
    109 // Move the file to the uploads dir
    110 $file = $uploads['path'] . "/$filename";
    111 if ( false === move_uploaded_file($_FILES['image']['tmp_name'], $file) )
    112     die('The uploaded file could not be moved to $file.');
    113 chmod($file, 0666);  // FIXME: Need to set this according to rw bits on parent dir.
    114 
    115 // Compute the URL
    116 $url = $uploads['url'] . "/$filename";
     47$overrides = array('action'=>'save');
     48
     49$file = wp_handle_upload($_FILES['image'], $overrides);
     50
     51if ( isset($file['error']) )
     52    die($file['error'] . '<a href="' . basename(__FILE__) . '?action=upload&post="' . $post . '">Back to Image Uploading</a>');
     53
     54$url = $file['url'];
     55$file = $file['file'];
     56$filename = basename($file);
    11757
    11858// Construct the object array
     
    14282if ( $imagedata['width'] * $imagedata['height'] < 3 * 1024 * 1024 ) {
    14383    if ( $imagedata['width'] > 128 && $imagedata['width'] >= $imagedata['height'] * 4 / 3 )
    144         $error = wp_create_thumbnail($file, 128);
     84        $error = wp_create_thumbnail($file['file'], 128);
    14585    elseif ( $imagedata['height'] > 96 )
    14686        $error = wp_create_thumbnail($file, 96);
     
    261201break;
    262202
     203case 'flickr':
     204
     205require_once ABSPATH . WPINC . '/class-snoopy.php';
     206
     207function flickr_api_call($method, $params = '') {
     208    $api_key = '7cd7b7dea9c9d3069caf99d12471008e';  // An API key reserved for WordPress
     209    $searchurl = 'http://www.flickr.com/services/rest/?method=' . $method . '&api_key=' . $api_key . '&' . $params;
     210    $client = new Snoopy();
     211    $client->agent = 'WordPress/Flickr Browser';
     212    $client->read_timeout = 2;
     213    $client->use_gzip = true;
     214    @$client->fetch($searchurl);
     215    return $client->results;
     216}
     217
     218// How many images do we show? How many do we query?
     219$num = 5;
     220$double = $num * 2;
     221
     222$flickr_user_id = get_user_option('flickr_userid');
     223if($flickr_user_id == '') {
     224    $flickr_username = get_user_option('flickr_username');
     225    $user_xml = flickr_api_call('flickr.people.findByUsername', "username={$flickr_username}");
     226    if(preg_match('/nsid="(.*?)">/', $user_xml, $matches)) {
     227        $flickr_user_id = $matches[1];
     228    }
     229    else die("Failed to find Flickr ID for '$flickr_username'"); // Oh, dear - no Flickr user_id!
     230
     231    // Store the found Flickr user_id in usermeta...
     232    // Don't forget on the options page to update the user_id along with the username!
     233    update_user_option($current_user->id, 'flickr_userid', $flickr_user_id, true);
     234}
     235
     236// Fetch photo list from Flickr
     237$ustart = $start + 1;
     238//$photos_xml = flickr_api_call('flickr.photos.search', array('per_page' => $num,  'user_id' => $flickr_user_id));
     239if($flickrtag == '') {
     240    $all = '0';
     241    $photos_xml = flickr_api_call('flickr.people.getPublicPhotos', "per_page={$num}&user_id={$flickr_user_id}&page={$ustart}");
     242}
     243else {
     244    $photos_xml = flickr_api_call('flickr.photos.search', "per_page={$num}&user_id={$flickr_user_id}&page={$ustart}&tags={$flickrtag}");
     245    $all = '0&flickrtag=' . $flickrtag;
     246}
     247//echo "<pre>" . htmlentities($photos_xml) . "</pre>";  // Displays the XML returned by Flickr for the photo list
     248
     249//Get Page Count
     250preg_match('/<photos.*pages="([0-9]+)"/', $photos_xml, $page_counta);
     251$page_count = $page_counta[1];
     252if($page_count == 0) {
     253    $back = false;
     254    $next = false;
     255    break;
     256}
     257if($start < $page_count) $next = $start + 1; else $next = false;
     258if($start > 0) $back = $start - 1; else $back = false;
     259if($last != '') {
     260    $photos_xml = flickr_api_call('flickr.people.getPublicPhotos', "per_page={$num}&user_id={$flickr_user_id}&page={$page_count}");
     261    $back = $page_count -1;
     262    $next = false;
     263}
     264
     265//Get Photos
     266preg_match_all('/<photo.*?id="([0-9]+)".*?secret="([0-9a-f]+)".*?server="([0-9]+)".*?title="([^"]*)".*?\/>/', $photos_xml, $matches, PREG_SET_ORDER);
     267foreach($matches as $match) {
     268    $img['post_title'] = $match[4];
     269
     270    $sizes_xml = flickr_api_call('flickr.photos.getSizes', "photo_id={$match[1]}");
     271    preg_match_all('/<size.*?label="([^"]+)".*?width="([0-9]+)".*?height="([0-9]+)".*?source="([^"]+)".*?\/>/', $sizes_xml, $sizes, PREG_SET_ORDER);
     272
     273    $max_size = '';
     274    foreach($sizes as $size) {
     275        $img_size[$size[1]]['width'] = $size[2];
     276        $img_size[$size[1]]['height'] = $size[3];
     277        $img_size[$size[1]]['url'] = $size[4];
     278        if($max_size == '' || $img_size[$size[1]]['width'] > $img_size[$max_size]['width']) {
     279            $max_size = $size[1];
     280        }
     281    }
     282
     283    $images[] = array(
     284        'post_title' => $match[4],
     285        'thumbnail' => $img_size['Thumbnail']['url'],
     286        'full' => $img_size[$max_size]['url'],
     287        'href' => "http://flickr.com/photos/{$flickr_user_id}/{$match[1]}/",
     288        'width' => $img_size['Thumbnail']['width'],
     289        'height' => $img_size['Thumbnail']['height'],
     290        'size_info' => $img_size,
     291    );
     292}
     293
     294$current_flickr = ' class="current"';
     295
     296$__use_size = __('Use %s');
     297$__close = __('CLOSE');
     298
     299$images_script .= "var flickr_src = new Array();\n";
     300
     301$i=0;
     302foreach($images as $image) {
     303        list($uwidth, $uheight) = get_udims($image['width'], $image['height']);
     304        $xpadding = (128 - $uwidth) / 2;
     305        $ypadding = (96 - $uheight) / 2;
     306        $height_width = 'height="'.$uheight.'" width="'.$uwidth.'"';
     307        $images_style .= "#target$i img { padding: {$ypadding}px {$xpadding}px; }\n";
     308        $images_html .= "
     309            <div id='target$i' class='imagewrap left'>
     310                <div id='popup$i' class='popup'>
     311        ";
     312
     313        $images_script .= "flickr_src[$i] = new Array();\n";
     314        foreach($image['size_info'] as $szkey => $size) {
     315            $images_script .= "flickr_src[$i]['{$szkey}']= '{$size['url']}';\n";
     316            $use = sprintf($__use_size, $szkey);
     317            $prefix = ($szkey == 'Thumbnail') ? '<strong>':'';
     318            $postfix = ($szkey == 'Thumbnail') ? '</strong>':'';
     319            $images_html .= "<a id=\"I{$i}_{$szkey}\" onclick=\"toggleSize($i,'$szkey');return false;\" href=\"javascript:void();\">{$prefix}{$use}{$postfix}</a>\n";
     320        }
     321        $images_html .= "
     322                    <a onclick=\"popup.style.display='none';return false;\" href=\"javascript:void()\">$__close</a>
     323                </div>
     324                <a id=\"link$i\" class=\"imagelink\" href=\"{$image['href']}\" onclick=\"imagePopup($i);return false;\" title=\"{$image['post_title']}\">
     325                    <img id=\"image$i\" src=\"{$image['thumbnail']}\" alt=\"{$image['post_title']}\" $height_width />
     326                </a>
     327            </div>
     328        ";
     329        $i++;
     330}
     331
     332$images_width = ( count($images) * 133 ) + 5;
     333
     334break;
     335
    263336default:
    264337die('This script was not meant to be called directly.');
     
    323396    }
    324397}
     398function toggleSize(n,sz) {
     399    o = document.getElementById('image'+n);
     400    oi = document.getElementById('popup'+n);
     401    o.src = flickr_src[n][sz];
     402    if (!document.getElementsByTagName) return;
     403    var anchors = document.getElementsByTagName("a");
     404    var re_id = 'I'+n+'_'; // /i[0-9]+_.+/i;
     405    var re_strip = /<.*?>/i;
     406    for (var i=0; i< anchors.length; i++) {
     407        var anchor = anchors[i];
     408        if (anchor.getAttribute("href") && anchor.id.match(re_id))
     409            anchor.innerHTML = anchor.innerHTML.replace(re_strip, '');
     410    }
     411    var anchor = document.getElementById('I'+n+'_'+sz);
     412    anchor.innerHTML = '<strong>' + anchor.innerHTML + '</strong>';
     413}
    325414</script>
    326415<style type="text/css">
     
    348437padding: 5px 15px;
    349438height: 96px;
     439white-space: nowrap;
    350440width: <?php echo $images_width; ?>px;
    351441}
     
    356446.imagewrap {
    357447margin-right: 5px;
     448height: 96px;
     449overflow: hidden;
    358450}
    359451.imagewrap * {
     
    365457text-decoration: none;
    366458float: left;
    367 display: block;
     459/*display: block;*/
    368460text-align: center;
    369461}
     
    456548color: #000;
    457549}
     550#flickrtags {
     551    display: inline;
     552}
     553#flickrtags input {
     554    border:0px;
     555}
     556input#flickrtag {
     557    background-color: white;
     558    color: black;
     559    width:65px;
     560}
     561input#flickrsubmit {
     562    background-color: #dfe8f1;
     563    color: black;
     564}
    458565</style>
    459566</head>
     
    461568<ul id="menu">
    462569<li<?php echo $current_1; ?>><a href="image-uploading.php?action=upload&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>">Upload Photo</a></li>
     570<li<?php echo $current_flickr; ?>><a href="image-uploading.php?action=flickr&amp;post=<?php echo $post; ?>">Browse Flickr</a></li>
    463571<li<?php echo $current_2; ?>><a href="image-uploading.php?action=view&amp;post=<?php echo $post; ?>">Browse Attached</a></li>
    464572<li<?php echo $current_3; ?>><a href="image-uploading.php?action=view&amp;post=<?php echo $post; ?>&amp;all=true">Browse All</a></li>
    465573<li> </li>
    466574<?php if ( false !== $back ) : ?>
    467 <li class="spacer"><a href="image-uploading.php?action=view&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>&amp;start=0" title="First">|&lt;</a></li>
    468 <li><a href="image-uploading.php?action=view&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>&amp;start=<?php echo $back; ?>" title="Back">&lt;&lt;</a></li>
     575<li class="spacer"><a href="image-uploading.php?action=<?php echo $action; ?>&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>&amp;start=0" title="First">|&lt;</a></li>
     576<li><a href="image-uploading.php?action=<?php echo $action; ?>&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>&amp;start=<?php echo $back; ?>" title="Back">&lt;&lt;</a></li>
    469577<?php else : ?>
    470578<li class="inactive spacer">|&lt;</li>
    471579<li class="inactive">&lt;&lt;</li>
    472580<?php endif; ?>
     581
     582<?php if($action == 'flickr') : ?>
     583<form id="flickrtags" method="get"><?php echo sprintf(__('Tag: %s'), '<input type="text" id="flickrtag" name="flickrtag" value="' . $flickrtag . '" />'); ?><input id="flickrsubmit" type="submit" value="Filter" /><?php
     584parse_str($_SERVER['QUERY_STRING'], $formquery);
     585foreach($formquery as $k=>$v) if($k!='flickrtag') echo "<input type=\"hidden\" name=\"$k\" value=\"$v\" />";
     586?></form>
     587<?php endif; ?>
     588
    473589<?php if ( false !== $next ) : ?>
    474 <li><a href="image-uploading.php?action=view&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>&amp;start=<?php echo $next; ?>" title="Next">&gt;&gt;</a></li>
    475 <li><a href="image-uploading.php?action=view&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>&amp;last=true" title="Last">&gt;|</a></li>
     590<li><a href="image-uploading.php?action=<?php echo $action; ?>&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>&amp;start=<?php echo $next; ?>" title="Next">&gt;&gt;</a></li>
     591<li><a href="image-uploading.php?action=<?php echo $action; ?>&amp;post=<?php echo $post; ?>&amp;all=<?php echo $all; ?>&amp;last=true" title="Last">&gt;|</a></li>
    476592<?php else : ?>
    477593<li class="inactive">&gt;&gt;</li>
     
    479595<?php endif; ?>
    480596</ul>
    481 <?php if ( $action == 'view' ) : ?>
    482 <span class="left tip">Drag and drop photos to post</span>
    483 <span class="right tip">Click photos for more options</span>
     597<?php if ( $action == 'view' || $action == 'flickr' ) : ?>
     598<span class="left tip"><?php _e('Drag and drop photos to post'); ?></span>
     599<span class="right tip"><?php _e('Click photos for more options'); ?></span>
    484600<div id="wrap">
    485601<div id="images">
     
    487603</div>
    488604</div>
    489 <?php elseif ( $action = 'upload' ) : ?>
     605<?php elseif ( $action == 'upload' ) : ?>
    490606<div class="center tip">Duplicated filenames will be numbered (photo.jpg, photo1.jpg, etc.)</div>
    491607<form enctype="multipart/form-data" id="uploadForm" method="POST" action="image-uploading.php" onsubmit="return validateImageName()">
     
    504620</body>
    505621</html>
     622
     623
     624
Note: See TracChangeset for help on using the changeset viewer.