我正在尝试为用户制作表单,以便一次上传多张图片。我试图将所有一次提交的图像放入同一个MySQL表行。我遇到的问题是,当用户提交图像时,除了image,image1,image2,image3和image4列之外,所有数据都被正确地提交到列中。我认为这些列是保存实际图像文件的列。例如,我提交了一个图片,图片列显示[BLOB - 14 B]
,当我认为它应该至少为300 KB时。我还有一个viewimage.php页面,通常应该显示一个图像,它显示一个微小的错误图片。我相信这意味着该列不包含任何图像文件。
这是我的完整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=scom;dbname=ksm", 'kesgbm', 'Kszer'); // I tested with MySQL database and worked fine.
$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;
感谢您的帮助。我感谢所有给予的帮助。
附加信息:如果至少第一个输入已被赋予图像,则表单仅应提交图像。如果用户将第一个图像输入留空但选择第二个输入图像,则表单将不会提交。第一个图像输入应该作为用户的显示图像,这就是我希望首先需要它的原因。用户不必上传所有5张图片以便提交表单。
答案 0 :(得分:1)
对于上传的每张图片,您都在执行INSERT
查询。 4个图像等于4个插入查询。每个插入查询都在MySQL数据库中生成新行。您应该在结尾处仅执行一个INSERT
查询,如果已上载图像,则向该查询添加更多值。重写代码需要一些时间。我想你也可以使用:
<input name="userfile[]" type="file" /><br />
<input name="userfile[]" type="file" /><br />
而不是userfile
,userfile1
等。
<强> @EDIT 强>
最后,我重写了代码并且它正在运行。我在MySQL数据库上测试过它。
<!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('mdsm;dbname=kesm', 'kabm', 'Kar'); // I tested with MySQL database and worked fine.
$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();
}
}
?>
答案 1 :(得分:0)
您为每个文件运行"INSERT INTO testblob (
。
将SQL查询放在循环之外。