将文件扩展名添加到临时文件

时间:2014-05-23 作者:Lasse M. Tvedt

我正在使用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;

}    
谢谢。

1 个回复
最合适的回答,由SO网友:birgire 整理而成

问题:例如,当您下载带有扩展名的图像时jsbach_image.jpg, 在临时目录中如下所示:

/tmp/jsbach.tmp
但当您下载一个没有扩展名的图像时,例如mozart_image, 您将获得:

/tmp/mozart 
但后者不会通过filetype- and extension testswp_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;
}  
我希望这有帮助。

结束

相关推荐

上传的图像不在/Uploads文件夹中

网站存在巨大问题。我更新了主题以使用帖子缩略图(这是多么旧),然后在尝试上载图像以用作特色缩略图时:图像会处理/压缩,但URL会导致404。网站没有任何异常。htaccess。实际上没有wp content/uploads目录,所以我做了一个,chmod权限是0755,所以这不应该是问题所在。我将“媒体设置”文件夹重置为默认文件夹,但该文件夹中不会出现任何图像。编辑:将上载文件夹更改为0777权限似乎可以解决此问题。这样保留权限安全吗?