2010-03-03 17 views
2

请有人可以帮忙吗?我有以下代码将文件上传到我的服务器并将其重命名为登录用户所在的用户。例如,用户'可口可乐爱好者'上传了一个jpeg - 脚本也会重命名jpeg'coca-cola-lover.jpg'。限制文件上传到只需jpegs与php

我的问题是,我需要它来限制上传到只是jpegs - 也限制文件大小为2MB。

请帮助 - 我试图找到一个解决方案整晚。

在此先感谢

// Your file name you are uploading 
$file_name = $HTTP_POST_FILES['ufile']['name']; 
$username = $row_Recordset1['username']; 

$ext = end(explode('.', $file_name)); 

$renamed_file_name = $username; 

$new_file_name=$renamed_file_name.'.'.$ext; 

//set where you want to store files 
//in this example we keep file in folder upload 
//$new_file_name = new upload file name 
//for example upload file name cartoon.gif . $path will be upload/cartoon.gif 
$path= "../sites/images/users/".$new_file_name; 
if($ufile !=none) 
{ 
if(copy($HTTP_POST_FILES['ufile']['tmp_name'], $path)) 
{ 
echo "Successful<BR/>"; 

//$new_file_name = new file name 
//$HTTP_POST_FILES['ufile']['size'] = file size 
//$HTTP_POST_FILES['ufile']['type'] = type of file 
echo "File Name :".$new_file_name."<BR/>"; 
echo "File Size :".$HTTP_POST_FILES['ufile']['size']."<BR/>"; 
echo "File Type :".$HTTP_POST_FILES['ufile']['type']."<BR/>"; 
} 
else 
{ 
echo "Error"; 
} 
} 

回答

3

getimagesize告诉你什么格式的文件是

按BGY的评论,你也应该强制文件扩展名是你想要的东西:

$new_file_name=$renamed_file_name.'.'.$ext; // wrong, uses data from the client 

$new_file_name=$renamed_file_name.'.jpg'; // ok, just what we want 

永远不要信任,也不会使用客户端提供的文件名。

+0

+1最好的办法,以确定文件类型。 –

+0

您不能依赖getimagesize(),因为如果您将一些php代码注入二进制映像并将其重命名为3vil.php,您将能够执行嵌入式php代码。 –

+0

是的,对,后更新 – user187291

3

我会建议exif_imagetype

<?php 
    if (exif_imagetype('image.gif') != IMAGETYPE_GIF) { 
     die(The picture is not a gif'); 
    } 

详情请看这里:http://php.net/manual/en/function.exif-imagetype.php

+0

那么我会把这个放在我的代码中?我已经尝试过,但它只是返回一个错误。在此先感谢 –

+0

您将不得不确保** exif扩展名**在php.ini中启用或在编译期间内置。使用'phpinfo()'来检查它的存在。 – aefxx

3

你可以使用任何的四个检测文件的MIME类型:

您也可以限制MimeType from the FileUpload element,但由于这是客户端的代码,它可以很容易地被恶意用户删除(而且,这也是跨浏览器越野车):

<input type="file" name="picture" id="picture" accept="image/jpeg"/> 

欲了解更多有关如何handle file uploads with PHP (including limiting file size), check the manual

还有a lot of very similar questions on Stack Overflow已,其中之一是:

1

当前代码

  1. 使用$_FILES,而不是$HTTP_POST_FILES一些建议。
  2. 如果需要获取文件扩展名,请使用$extension = pathinfo($filename, PATHINFO_EXTENSION);。使用is_uploaded_filemove_uploaded_file
  3. 不要继续在$_FILES['file']['type'] - 它可以由用户修改。
  4. 缩进你的代码。

如果你想限制文件上传到以下要求:

  1. 作品尺寸:最大2MB。
  2. 文件类型:image/jpeg

做这样的事情:

$tmpName = $_FILES['file']['tmp_name']; 
if (file_is_uploaded($tmpName) { 
    $filesize = fielsize($tmpName); 
    $mimeType = exif_imagetype('image.gif'); 

    if ($filesize <= 2 * 1024 * 1024 && $mimeType == IMAGETYPE_JPEG) { 
     $filename = $USERNAME . '.jpg'; 
     if (move_uploaded_file($tmpName, $filename) == false) { 
      // sth goes wrong 
     } 
    } else { 
     die('Invalid.'); 
    } 
} 
+0

这看起来不错 - 但不知道如何调整我的原始代码以重命名为用户名以及它应该上传到的位置。你能进一步帮助吗?在此先感谢 –

+0

我编辑了我的代码。 – Crozin

+0

再次感谢。我仍然迷失。我是新来的PHP和MySQL,所以我决心得到这个工作。我添加了'$ username = $ row_Recordset1 ['username'];'到您编写的代码,但不知道在哪里设置上传路径'../sites/images/users/' –