我有一个PHP表单,有五个输入供用户上传五个图像。用户必须至少选择一个图像,并且必须在第一个输入中,以便提交表单。表单将正确地将所有信息提交到MySQL表中,但图像本身除外。例如,我提交了一个图像,图像列显示[BLOB-14 B],当我认为它应该至少为300 KB。我的理论是,当图像被提交到MySQL表中时,图像被压缩成其他格式。
这是我的完整PHP页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head><title>File Upload To Database</title></head>
<body>
<h2>Please Choose a File and click Submit</h2>
<form enctype="multipart/form-data" action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="99999999" />
<div><input name="userfile[]" type="file" /></div>
<div><input name="userfile[]" type="file" /></div>
<div><input name="userfile[]" type="file" /></div>
<div><input name="userfile[]" type="file" /></div>
<div><input name="userfile[]" type="file" /></div>
<div><input type="submit" value="Submit" /></div>
</form>
</body></html>
<?php
/*** check if a file was submitted ***/
if(!isset($_FILES['userfile']))
{
echo '<p>Please upload a display picture.</p>';
}
else
{
try {
upload();
/*** give praise and thanks to the php gods ***/
echo '<p>Thank you for submitting</p>';
}
catch(Exception $e)
{
echo '<h4>'.$e->getMessage().'</h4>';
}
}
/*
* Check the file is of an allowed type
* Check if the uploaded file is no bigger thant the maximum allowed size
* connect to the database
* Insert the data
*/
/**
*
* the upload function
*
* @access public
*
* @return void
*
*/
function upload(){
$maxsize = 99999999;
$columnNames = '';
$columnValues = '';
$paramsToBeBound = array();
echo '<pre>' . print_r($_FILES, TRUE) . '</pre>';
/*** check if a file was uploaded ***/
for($i = 0; ($i < count($_FILES['userfile']['tmp_name']) && $i < 5); $i++) {
if($_FILES['userfile']['tmp_name'][$i] != '') { // check if file has been set to upload
if($_FILES['userfile']['error'][$i] == 0 && is_uploaded_file($_FILES['userfile']['tmp_name'][$i]) && getimagesize($_FILES['userfile']['tmp_name'][$i]) != false) {
/*** get the image info. ***/
$size = getimagesize($_FILES['userfile']['tmp_name'][$i]);
/*** assign our variables ***/
$type = $size['mime'];
$imgfp = fopen($_FILES['userfile']['tmp_name'][$i], 'rb');
$size = $size[3];
$name = $_FILES['userfile']['name'][$i];
/*** check the file is less than the maximum file size ***/
if($_FILES['userfile']['size'][$i] < $maxsize)
{
if($i > 0) {
$columnNames .= ', image_type' . $i . ', image' . $i . ', image_size' . $i . ', image_name' .$i;
$columnValues .= ', ?, ?, ?, ?';
} else {
$columnNames .= 'image_type, image, image_size, image_name';
$columnValues .= '?, ?, ?, ?';
}
$paramsToBeBound[] = $type;
$paramsToBeBound[] = $imgfp;
$paramsToBeBound[] = $size;
$paramsToBeBound[] = $name;
} else
throw new Exception("File Size Error"); //throw an exception is image is not of type
}
else
{
// if the file is not less than the maximum allowed, print an error
throw new Exception("Unsupported Image Format of image!");
}
}
}
if(count($paramsToBeBound) > 0) {
$dbh = new PDO("mysql:host=dsa.com;dbname=s_gbm", 'kss', 'Kisr');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare('INSERT INTO testblob (' . $columnNames . ') VALUES (' . $columnValues . ')');
$i = 0;
foreach($paramsToBeBound as &$param) {
$i++;
if($i == 2 || $i - floor($i / 4) == 2) {
$stmt->bindParam($i, $param, PDO::PARAM_LOB);
} else {
$stmt->bindParam($i, $param);
}
}
$stmt->execute();
}
}
?>
以下是我在PHP MyAdmin SQL中用来创建MySQL表的代码:
CREATE TABLE testblob ( image_id tinyint(3) NOT NULL AUTO_INCREMENT, image_type varchar(25) NOT NULL, image longblob NOT NULL, image_size varchar(25) NOT NULL, image_name varchar(50) NOT NULL, image_type1 varchar(25) NOT NULL, image1 longblob NOT NULL, image_size1 varchar(25) NOT NULL, image_name1 varchar(50) NOT NULL, image_type2 varchar(25) NOT NULL, image2 longblob NOT NULL, image_size2 varchar(25) NOT NULL, image_name2 varchar(50) NOT NULL, image_type3 varchar(25) NOT NULL, image3 longblob NOT NULL, image_size3 varchar(25) NOT NULL, image_name3 varchar(50) NOT NULL, image_type4 varchar(25) NOT NULL, image4 longblob NOT NULL, image_size4 varchar(25) NOT NULL, image_name4 varchar(50) NOT NULL, image_ctgy varchar(25) NOT NULL, KEY image_id (image_id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
感谢您的帮助。我感谢所有给予的帮助。
答案 0 :(得分:3)
首先,我建议不要在MySQL中存储图像,除非你绝对必须这样做。
你绝对要吗?是?那真不幸。这应该有所帮助......
$imgfp = fopen($_FILES['userfile']['tmp_name'][$i], 'rb');
$imageData = fread($imgfp, filesize($_FILES['userfile']['tmp_name'][$i]));
$imageData = addslashes($imageData);
fclose($imgfp);
…
…
$paramsToBeBound[] = $imageData;
答案 1 :(得分:2)
你永远不应该在MySQL数据库中存储任何媒体类型,你应该做的是将媒体文件(无论是图片还是视频)存储在本地硬盘上,然后让MySQL存储一个文件,在需要时调用该媒体类型。我希望这有帮助(=