Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Images corrupted after copying

Trying to copy images from remote server to use as thumbnails in my wordpress site. Some of this images become corrupted after copying.

Here's my code:

$url = 'http://media.cultserv.ru/i/1000x1000/'.$event->subevents[0]->image;
$timeout_seconds = 100;
$temp_file = download_url( $url, $timeout_seconds );

if(!is_wp_error( $temp_file )) {
  $file = array(
    'name' => basename($url),
    'type' => wp_check_filetype(basename($url), null),
    'tmp_name' => $temp_file,
    'error' => 0,
    'size' => filesize($temp_file),
  );
  $overrides = array(
    'test_form' => false,
    'test_size' => true,
    'test_upload' => true,
  );
  $results = wp_handle_sideload( $file, $overrides );
  if(empty($results['error'])) {
    $filename = $results['file'];
    $local_url = $results['url'];
    $type = $results['type'];
    $attachment = array(
      'post_mime_type' => $results['type'],
      'post_title' => preg_replace('/.[^.]+$/', '', basename( $results['file'] ) ),
      'post_content' => '',
      'post_status' => 'inherit',
      'post_type' => 'attachment',
      'post_parent' => $pID,
    );
    $attachment_id = wp_insert_attachment( $attachment, $filename );
    if($attachment_id) {
      set_post_thumbnail( $pID, $attachment_id );
    }
  }
}

Here's a screenshot that shows what I mean (Left - original image; Right - copy on my server):

screenshot

like image 489
Dmitry Kapusta Avatar asked Nov 09 '22 08:11

Dmitry Kapusta


1 Answers

I think that your download_url( $url, $timeout_seconds ) function is not working properly (you don't get to catch network/other errors, that's why you have corrupted images), also I don't think that the timeout parameter is really needed to download an url...

To fix this it's better to rewrite this function into something like this :

function download_url($url)
{
    $saveto = 'temp.jpg'; // generate temp file
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    $raw = curl_exec($ch);
    if (curl_errno($ch)) {
        curl_close($ch);
        return false;
        // you probably have a network problem here.
        // you need to handle it, for example retry or skip and reqeue the image url
    }
    curl_close($ch);
    if (file_exists($saveto)) {
        unlink($saveto);
    }
    $fp = fopen($saveto, 'x');
    fwrite($fp, $raw);
    fclose($fp);
    return $saveto;
}
like image 107
mrbm Avatar answered Nov 15 '22 11:11

mrbm