WordPress中的自定义图片上传字段

3

我正在WordPress中开发自定义图片上传字段,但是一旦上传成功后,处理图片方面遇到了很多困难。除了上传外,我还需要将图像调整大小以创建缩略图。每次尝试使用已上传的图像进行处理时,都会出现无法找到文件的错误(即使我可以在浏览器中查看它,并且该文件明确位于目录中)。上传的图片默认权限为666,但我也尝试过将其更改为777,但结果相同。调整大小的函数在上传后单独调用。这是我尝试过的其中一种方法:

function resize_author_picture($filename) {
  $filename = $_POST['file'];
  $file = fopen($filename, 'r');
  $data = fread($file);
  fclose($file);
  $dimensions = getimagesize($filename);
  $dir = dirname($filename);
  $crop = wp_crop_image( $data, $dimensions[0], $dimensions[1], 0, 0, 250, 280, null, $dir."/image.jpg" );

  die( "crop: ".var_dump($crop)." file: ".$filename." path: ".$dir."/image.jpg" );
 }

当提供图片路径不起作用时,我尝试使用fopen()作为第二次尝试。以下是先前的尝试:

function resize_author_picture($file) {
 $file = $_POST['file'];
 $dimensions = getimagesize($file);
 $dir = dirname($file);
 $crop = wp_crop_image( $file, $dimensions[0], $dimensions[1], 0, 0, 250, 280, null, $dir."/image.jpg" );
 die( "crop: ".var_dump($crop)." file: ".$file." path: ".$dir."/image.jpg" );
}

两者均返回一个WP错误对象,格式如下:
string(123) "File <http://site.local/wp-content/uploads/2010/09/squares-wide.jpeg> doesn't exist?"

想不出主意了,欢迎提供任何意见!


即使进行了编辑,我的答案仍然适用。我已经用一个具体的例子进行了更新。 - Johannes Pille
2个回答

2

虽然这个问题很久了,但我认为你仍然需要答案:

你遇到的错误是wp_load_image返回的,它被wp_crop_image使用。 wp_load_image使用php函数file_exists,需要提供文件路径而不是域名。

因此,

$crop = wp_crop_image( $file, $dimensions[0], $dimensions[1], 0, 0, 250, 280,
        null, "wp-content/uploads/2010/09/squares-wide.jpeg" );

本来可以工作的。

另外,wp_upload_bits 不仅会为你上传文件,还会返回已上传文件的 URL。

如果你像这样调用 wp_upload_bits(其中 "file" 是表单输入的名称):

if ($_FILES["file"]["name"]!="") {
    $uploaded_file = wp_upload_bits($_FILES["file"]["name"], null,
        file_get_contents($_FILES["file"]["tmp_name"]));
}

因此,$uploaded_file ['url']等同于$dir."/image.jpg" 。在上面的裁剪中,您可以使用$uploaded_file['url']的子字符串。

具体例子:

使用http://site.local/wp-content/uploads/2010/09/squares-wide.jpeg将会起作用:

$dir = dirname($file);
$dir_substr = substr($dir, 18)
$crop = wp_crop_image( $file, $dimensions[0], $dimensions[1], 0, 0, 250, 280,
        null, $dir."/squares-wide.jpeg" );

当然,您也希望文件名是动态的,所以我建议像上面提到的那样调用wp_upload_bits(如果它不是来自表单字段,而是来自WP自定义字段,请像现在一样调用它,重要的部分是将$uploaded_file = wp_upload_bits(...)返回的结果保存在变量中以供以后使用),然后执行。
$file_uri = substr($uploaded_file['url'], 18);
$crop = wp_crop_image( $file, $dimensions[0], $dimensions[1], 0, 0, 250, 280,
        null, $file_uri );

0
如果您使用了内联上传功能,则您的图片将位于 /wp-content/uploads 文件夹中,除非您在“其他”管理面板上指定了另一个文件夹。
请确保您没有更改上传目录位置。
尝试使用 WP 文章工具进行上传,以确保您的设置正确。然后继续调试代码 - 一旦排除了最基本的问题。

不是问题 - 图像已成功上传并存在于我期望的wp-content/images中。只是似乎在wp_upload_bits()之后的任何脚本都无法访问这些图像。 - Gavin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接