我在将图片上传到服务器时遇到问题(首先我将其转换为.png并调整其大小):
在functions.php中
function imageUploadedResize($source, $target,$nWidth, $nHeight)
{
$sourceImg = Imagecreatefromstring(file_get_contents($source));
if ($sourceImg === false)
{
return false;
}
$width = imagesx($sourceImg);
$height = imagesy($sourceImg);
$targetImg = imagecreatetruecolor($nWidth, $nHeight);
imagecopyresized($targetImg, $sourceImg, 0, 0, 0, 0, $nWidth,$nHeight,$width, $height);
imagedestroy($sourceImg);
imagepng($targetImg, $target);
imagedestroy($targetImg);
}
在uploadtoServer.php
中if(isset($_POST["fileToUpload"]))
{
$target_dir = "img/data/";
$fn = $_FILES['fileToUpload']['tmp_name'];
$newFileName = mysqli_insert_id($link).".png";
header('Content-type: image/png');
imageUploadedResize($fn, $target_dir.$newFileName, 45,60);
}
如果我将$ fn更改为静态图像,例如" https://pbs.twimg.com/profile_images/54789364/JPG-logo-highres.jpg"它的工作原理我觉得我在$ fn有问题。有什么想法可以吗?
答案 0 :(得分:2)
第1部分:
正如Johnathan所提到的,当文件上传表单提供isset($_POST["fileToUpload"])
数组中的值时,您正在检查$_FILES
。因此,您需要将引用从$_POST
更改为$_FILES
,否则它将始终返回false。
编辑:由于您的评论声明您获得100%错误,因此您应该使用更具体的限定符,例如if($_FILES['fileToUpload']['error'] == 0)
。
提交数据的HTML表单需要为enctype="multipart/form-data"
,否则您的服务器将不会从您的表单中收集任何形状的文件。还需要在POST
方法中设置HTML表单。
第2部分
您对图像的文件系统存储的引用(例如$target_dir = "img/data/";
)是相对的,因此这意味着$target_dir
的值必须是调用该脚本块的文件的子级。
使用绝对文件系统引用可能对您有很大帮助,通常(但不是唯一)使用$_SERVER['DOCUMENT_ROOT']."/img/data"
;
此示例将数据存储在www.your-web-site.com/img/data
位置。
第3部分
您有一个标题设置内容类型为image/png
,但您实际上并未输出图像,而是将其保存到上面提到的文件参考中。如果您想输出图像到浏览器,您需要跳过保存它:
imagepng($targetImg, NULL);
然后将$targetImg
中的图像直接输出到浏览器。目前您似乎保存但显示它,尽管设置了图像标题,这意味着对浏览器的任何输出都应该是图像内容。
某些 系统对新上传的数据有限制并防止数据处理过于自由,为了解决这个问题,建议使用move_upladed_file
将文件保存到“正确”的目标,然后访问它以输出到浏览器。
您应该在对文件执行操作之前检查$_FILES['fileToUpload']['error']
,因为这会告诉您文件是否存在。使用isset
是一个糟糕的(非常含糊的)想法,因为即使文件尚未上传,仍然可以设置数组。
您应该使用PHP error logging。您不应该使用错误抑制@
。