我正在使用download\\u url()下载一个临时文件,并希望使用media\\u handle\\u sideload将此文件保存在我的uploads文件夹中。这适用于具有文件扩展名的文件。
media\\u handle\\u sideload dosent处理没有文件扩展名的文件。例如,当我试图保存时this 它不会保存图像,因为url没有文件扩展名。
那么我需要使用image_type_to_extension(exif_imagetype($imageurl));
获取图像的文件扩展名。如何将此文件扩展名添加到临时文件?
这是我的代码:
public function upload_image_from_url($imageurl) {
// Get the file extension for the image
$fileextension = image_type_to_extension(exif_imagetype($imageurl));
// Save as a temporary file
$tmp = download_url( $imageurl );
$file_array = array(
\'name\' => basename( $imageurl ),
\'tmp_name\' => $tmp
);
// Check for download errors
if ( is_wp_error( $tmp ) ) {
@unlink( $file_array[ \'tmp_name\' ] );
return $tmp;
}
$id = media_handle_sideload( $file_array, 0 );
// Check for handle sideload errors.
if ( is_wp_error( $id ) ) {
@unlink( $file_array[\'tmp_name\'] );
return $id;
}
$attachment_url = wp_get_attachment_url( $id );
return $attachment_url;
}
谢谢。
最合适的回答,由SO网友:birgire 整理而成
问题:例如,当您下载带有扩展名的图像时jsbach_image.jpg
, 在临时目录中如下所示:
/tmp/jsbach.tmp
但当您下载一个没有扩展名的图像时,例如
mozart_image
, 您将获得:
/tmp/mozart
但后者不会通过
filetype- and extension tests 在
wp_handle_sideload()
函数,由调用
media_handle_sideload()
作用
一个可能的解决方案是:我们可以通过重命名(或复制)带有扩展名的临时文件,欺骗它通过测试。
您可以尝试以下修改:
/**
* Upload an image from an url, with support for filenames without an extension
*
* @link http://wordpress.stackexchange.com/a/145349/26350
* @param string $imageurl
* @return string $attachment_url
*/
function upload_image_from_url( $imageurl )
{
require_once( ABSPATH . \'wp-admin/includes/image.php\' );
require_once( ABSPATH . \'wp-admin/includes/file.php\' );
require_once( ABSPATH . \'wp-admin/includes/media.php\' );
// Get the file extension for the image
$fileextension = image_type_to_extension( exif_imagetype( $imageurl ) );
// Save as a temporary file
$tmp = download_url( $imageurl );
// Check for download errors
if ( is_wp_error( $tmp ) )
{
@unlink( $file_array[ \'tmp_name\' ] );
return $tmp;
}
// Image base name:
$name = basename( $imageurl );
// Take care of image files without extension:
$path = pathinfo( $tmp );
if( ! isset( $path[\'extension\'] ) ):
$tmpnew = $tmp . \'.tmp\';
if( ! rename( $tmp, $tmpnew ) ):
return \'\';
else:
$ext = pathinfo( $imageurl, PATHINFO_EXTENSION );
$name = pathinfo( $imageurl, PATHINFO_FILENAME ) . $fileextension;
$tmp = $tmpnew;
endif;
endif;
// Upload the image into the WordPress Media Library:
$file_array = array(
\'name\' => $name,
\'tmp_name\' => $tmp
);
$id = media_handle_sideload( $file_array, 0 );
// Check for handle sideload errors:
if ( is_wp_error( $id ) )
{
@unlink( $file_array[\'tmp_name\'] );
return $id;
}
// Get the attachment url:
$attachment_url = wp_get_attachment_url( $id );
return $attachment_url;
}
我希望这有帮助。