我正在尝试使用php上传文件,它完美地工作到1Mb,我已经checked the forum并且发现缺少的常见事情是在php.ini上编辑这个值(我正在使用WAMP):
post_max_size = 8G upload_max_filesize = 2G
正如您所看到的,我已经将它们更改为千兆字节但仍然无法正常工作,所发生的是我点击上传并转到我的upload.php文件,只是挂在那里没有写入数据库。
我的HTML中有这个,但我已经对它进行了评论:
<!--input type="hidden" name="MAX_FILE_SIZE" value="20000000000" /-->
我的上传php是:
<?php
include("mysql.class.php");
$mysql = new MySQL();
$tbl_name="documento";
session_start();
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0){
$fileName = $_FILES['userfile']['name'];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
$myusername=$_SESSION['myusername'];
if(!get_magic_quotes_gpc()){
$fileName = addslashes($fileName);
}
$query = "INSERT INTO $tbl_name (name, size, type, archivo,user_username ) ".
"VALUES ('$fileName', '$fileSize', '$fileType', '$content','$myusername')";
mysql_query($query) or die('Error, query failed');
echo "<br>File $fileName uploaded<br>";
header("location:admin.php");
}
?>
我在这里缺少什么?此外,当我上传图像(自180kbs)并下载它们以检查它们是否正确上传后,我无法看到图像,但文档没有问题。
答案 0 :(得分:4)
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content);
fclose($fp);
您正在转义文件的内容。这主要是导致图像无法显示的原因。 当你要将数据发送到远程目标时应该进行转义(使用htmlentities()
向浏览器发送'text',使用mysql_real_escape_string
将数据发送到MySQL数据库)。您应该查看PHP manual,如何正确实现文件上传。
将文件上传到PHP时,请遵循以下规则:
isset($_FILES['userfile'])
$_FILES['userfile']['error'] === 0
)。如果没有,则显示相应的错误消息。见this page for possible errors。$_FILES['userfile']['size'] < 102400
(将文件大小限制为100 kB)
(可选择检查文件是否为空,这取决于您的应用程序)$sanitizedFileName = preg_replace('#[^a-z0-9_-]#i', '', $_FILES['userfile']['name']);
检查已清理名称的扩展名,是否允许:
$allowedExtensions = array('png', 'jpg', 'jpeg', 'txt', 'gif');
$dotPos = strrchr($_FILES['userfile']['name'], '.');
$ext = '';
// Both FALSE and 0 will not match, I consider 'htaccess' in '.htaccess' not as an extension
if($dotPos){
// we are not interested whether the extension is in uppercase or lowercase
$ext = strtolower(substr($_FILES['userfile']['name'], $dotPos));
}
if(!in_array($ext, $allowedExtensions)){
echo 'Extension not allowed';
}
else{
// continue with uploading
}
(可选)使用图像功能验证图像,并使用getimagesize()限制尺寸(宽x高)。
move_uploaded_file($_FILES['userfile'], "$targetDir/$sanitizedFileName")
或将内容(file_get_contents($_FILES['userfile']['tmp_name'])
)存储在数据库中。
存储在数据库中时,请不要忘记escape您的数据。答案 1 :(得分:0)
我的猜测是它与你的addslashes($content)
声明有关。正如lekensteyn所说,这可能导致二进制数据(例如图像中)被破坏。不要使用addslashes()
,而是查看PHP的mysql_real_escape_string()
函数。
此外,在大多数情况下,我认为在数据库中存储文件上传等数据并不是最佳做法。您应该考虑将文件保存在磁盘上,并将其文件名存储在数据库中。在数据库中存储高达2GB的文件会给MySQL服务器带来不必要的负担。