Images damaged after copying

Attempting to copy images from a remote server for use as thumbnails on my wordpress site. Some of these images become damaged after copying.

Here is 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 is a screenshot that shows what I mean (Left - original image; Right - copying on my server):

screenshot

+5
source share
1 answer

I think your download_url( $url, $timeout_seconds ) function download_url( $url, $timeout_seconds ) does not work correctly (you cannot catch network / other errors, so you have corrupted images), also I don’t think that the timeout parameter is really necessary for downloading the URL. ..

To fix this, it’s better to rewrite this function 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; } 
+1
source

All Articles