上传个人资料图片并显示


Uploading a profile picture and displaying it

我希望用户能够上传个人资料图片(可以是.jpg.png),我也希望这能显示在他们的个人资料上。我已经写了一些代码,基于我在这里找到的源代码,在Stackoverflow和谷歌上。然而,它似乎不起作用,我找不到我的错误。

这是html

        <form action="account_settings.php" method="POST">
            <input type="file" name="profilePicture"><br><br>
            <input type="submit" value="Change!">
        </form>

这就是如何处理上传的文件。

<?php
include ('inc/header.inc.php');
if(isset($_FILES["profilePicture"]["tmp_name"]) && isset($_FILES["profilePicture"]["name"])) {
    $ext = pathinfo($_FILES['profilePicture']['name'], PATHINFO_EXTENSION);
    $name = $_SESSION['user_login'];
    $tmp_name = $_FILES["profilePicture"]["tmp_name"];
    if($ext == 'png' || $ext == 'jpg') {
         if (isset($tmp_name)) {
            if(!empty($tmp_name)) {
                $location = '../profielfotos/';
                $full_name = $name.'.'.$ext;
                if(move_uploaded_file($tmp_name, $location.$full_name)) {
                    echo 'Photo uploaded!';
                }
                Down here are just some else statements with error reports.

下面的代码用于显示图像。我把一张图片放在个人资料图片文件夹中进行了测试,它确实显示了图片。然而,仍然存在一个问题。人们可以上传.jpg.png,我如何让网站显示图片(找到扩展名正确的个人资料图片)。

我已将此代码放入<img>标记的src属性中。

<?php if ($handle = opendir('profielfotos/')) {
    $file = mysql_real_escape_string($_GET['u']);
    echo 'profielfotos/'.$file.'.png'; 
}
closedir($handle); 

我希望有人能帮忙,提前谢谢!ps。这是我第一篇关于堆栈溢出的文章:-D!

由于您没有存储任何关于上传文件的信息,您只需要使用file_exists()方法检查哪个文件存在。请参阅此处:

http://php.net/manual/en/function.file-exists.php

所以你的代码会变成这样(未测试):

<?php if ($handle = opendir('profielfotos/')) {
    $file = mysql_real_escape_string($_GET['u']);
    if (file_exists('profielfotos/'.$file.'.png')) {
        echo 'profielfotos/'.$file.'.png';
    } else if (file_exists('profielfotos/'.$file.'.jpg')) {
        echo 'profielfotos/'.$file.'.jpg';
    }
}
closedir($handle); 

您需要在表单中添加以下内容:

<form action="account_settings.php" method="POST" enctype="multipart/form-data">

否则,它将不允许上传文件,因为它只需要文本。

这是完全不安全的。用户上传的文件不得存储在网络服务器的根目录中。

相反,将文件放在文档根目录之外的某个位置。

编写一个处理程序,控制文件

  • 通过检查内容而不是扩展来检查mime类型
  • 有任意的名字,而不是上传的名字,这可能会干扰(想象5个人上传一个"profile.png")
  • 让处理程序通过id("…imagloader?file=4711")传递图像
  • 文件的名称(以及扩展名和位置)存储在数据库中(是否有用户记录?)