多个文件上传 仅上传一个 post
multiple file upload uploads only single post
我有以下使用 php 和 mysql 上传多个文件的代码。但是由于某些原因,如果选择了 'n' 个文件,似乎只上传了最后一个(或第 'n' 个)文件..
以下是相应的文件:
HTML
<form enctype="multipart/form-data" method="post" action="<?php echo htmlentities($_SERVER["PHP_SELF"]);?>">
<div class="form-group">
<textarea class="form-control" name="postbox" id="pbox"></textarea>
</div>
<h5><strong>Add media:</strong></h5>
<input type="file" name="pfile[]" multiple="multiple" accept="image/*,audio/*,video/*"><br/>
<button type="submit" class="btn btn-success" name="psubmit">Post!</button>
</form>
<div class="posts">
<?php
if(isset($_POST['postbox'])){
$ps = escape($_POST['postbox']);
}
include_once('includes/uploadfile.php'); ?>
</div>
includes/uploadfile.php
<?php ob_start();
require_once 'core/init.php';
if(isset($_POST['psubmit']))
{
foreach ($_FILES['pfile']['tmp_name'] as $key=>$value)
{
$pfname = $_FILES["pfile"]['name'][$key];
$pftype = $_FILES['pfile']['type'][$key];
$pfsize = $_FILES['pfile']['size'][$key];
$pftmploc = $_FILES['pfile']['tmp_name'][$key];
$pferror = $_FILES['pfile']['error'][$key];
$blast = explode(".", $pfname);
$pfextn = end($blast);
if (!empty($ps) && empty($pfname))
{
$dbfname = NULL;
$abc = $get->addPost($a, $ps, $pfname);
header('location:'.escape($_SERVER['PHP_SELF'])); exit;
}
else if (!empty($pfname) && !empty($ps))
{
//list($width, $height) = getimagesize($pftmploc);
if($pfsize > 20971520)
{
echo "ERROR: Your file was larger than 20 Megabytes in size.";
unlink($pftmploc);
exit();
}
else if(!preg_match("/.(gif|jpg|png|mp3|mp4|avi)$/i", $pfname) )
{
echo "ERROR: Restricted file format!Kindly stick to these formats alone:gif,jpg,png,mp3,mp4,avi";
unlink($pftmploc);
exit();
}
else if($pferror == 1)
{ // if file upload error key is equal to 1
echo "ERROR: An error occured while processing the file. Try again.";
exit();
}
}
$dbfname = rand(100000000000,999999999999).$pfname;
$updir = "ups/posts/";
$arraymov = array();
array_push($arraymov, $dbfname);
$movrslt = move_uploaded_file($pftmploc,$updir.$dbfname);
if($movrslt != true)
{
echo 'ERROR: File upload failed. Try again!';
exit();
}
}
$abc = $get->addPost($a, $ps, implode(',',$arraymov));
header('location:'.escape($_SERVER['PHP_SELF'])); exit;
}
?>
文件上传功能:
public function addPost($user_id,$status,$file_path){
$query = $this->_db->prepare("INSERT INTO postsinitial (puid, pstatus, postimg) VALUES (:k, :l, :m)");
$query->bindValue(':k',$user_id);
$query->bindValue(':l', nl2br(htmlentities($status, ENT_QUOTES, 'UTF-8')));
$query->bindValue(':m',$file_path);
$query->execute();
$rsizes = $query->rowCount();
if ($rsizes > 0) {
return true;
}
else
{
return false;
}
}
我尝试编写代码以将每个文件路径插入为逗号分隔的值数组,以便用户可以上传多张图像以仅在 database.This 中记录一条记录很重要!
提前发送!
foreach 看起来不太正确。在 uploadfile.php 中尝试使用此代码段代替 foreach 部分。它构建你的循环有点不同,检查 tmp_name 看看循环是否应该继续。
if(isset($_POST['psubmit']))
{
$imagearray = array();
for ($i = 0; $_FILES['pfile']['tmp_name'][$i] $i++)
{
$pfname = $_FILES["pfile"]['name'][$i];
$pftype = $_FILES['pfile']['type'][$i];
$pfsize = $_FILES['pfile']['size'][$i];
$pftmploc = $_FILES['pfile']['tmp_name'][$i];
$pferror = $_FILES['pfile']['error'][$i];
$blast = explode(".", $pfname);
$pfextn = end($blast);
array_push($imagearray, $pfname);
if (!empty($ps) && empty($pfname))
{ ...
看来你的逻辑有误。您必须在遍历 $_FILES 数组的同一个 foreach() 中执行 move_uploaded_file() 。
...
echo "ERROR: An error occured while processing the file. Try again.";
exit();
}
}
move_uploaded_file(...
}
您所做的是尝试使用 $pftmploc 变量作为临时文件路径在单独的 foreach 块中执行 move_uploaded_file()。但由于该变量是在前面的 foreach() 循环中分配的,因此它代表上传文件数组的最后一个元素。这就是为什么您没有上传所有文件的原因。
我有以下使用 php 和 mysql 上传多个文件的代码。但是由于某些原因,如果选择了 'n' 个文件,似乎只上传了最后一个(或第 'n' 个)文件..
以下是相应的文件:
HTML
<form enctype="multipart/form-data" method="post" action="<?php echo htmlentities($_SERVER["PHP_SELF"]);?>">
<div class="form-group">
<textarea class="form-control" name="postbox" id="pbox"></textarea>
</div>
<h5><strong>Add media:</strong></h5>
<input type="file" name="pfile[]" multiple="multiple" accept="image/*,audio/*,video/*"><br/>
<button type="submit" class="btn btn-success" name="psubmit">Post!</button>
</form>
<div class="posts">
<?php
if(isset($_POST['postbox'])){
$ps = escape($_POST['postbox']);
}
include_once('includes/uploadfile.php'); ?>
</div>
includes/uploadfile.php
<?php ob_start();
require_once 'core/init.php';
if(isset($_POST['psubmit']))
{
foreach ($_FILES['pfile']['tmp_name'] as $key=>$value)
{
$pfname = $_FILES["pfile"]['name'][$key];
$pftype = $_FILES['pfile']['type'][$key];
$pfsize = $_FILES['pfile']['size'][$key];
$pftmploc = $_FILES['pfile']['tmp_name'][$key];
$pferror = $_FILES['pfile']['error'][$key];
$blast = explode(".", $pfname);
$pfextn = end($blast);
if (!empty($ps) && empty($pfname))
{
$dbfname = NULL;
$abc = $get->addPost($a, $ps, $pfname);
header('location:'.escape($_SERVER['PHP_SELF'])); exit;
}
else if (!empty($pfname) && !empty($ps))
{
//list($width, $height) = getimagesize($pftmploc);
if($pfsize > 20971520)
{
echo "ERROR: Your file was larger than 20 Megabytes in size.";
unlink($pftmploc);
exit();
}
else if(!preg_match("/.(gif|jpg|png|mp3|mp4|avi)$/i", $pfname) )
{
echo "ERROR: Restricted file format!Kindly stick to these formats alone:gif,jpg,png,mp3,mp4,avi";
unlink($pftmploc);
exit();
}
else if($pferror == 1)
{ // if file upload error key is equal to 1
echo "ERROR: An error occured while processing the file. Try again.";
exit();
}
}
$dbfname = rand(100000000000,999999999999).$pfname;
$updir = "ups/posts/";
$arraymov = array();
array_push($arraymov, $dbfname);
$movrslt = move_uploaded_file($pftmploc,$updir.$dbfname);
if($movrslt != true)
{
echo 'ERROR: File upload failed. Try again!';
exit();
}
}
$abc = $get->addPost($a, $ps, implode(',',$arraymov));
header('location:'.escape($_SERVER['PHP_SELF'])); exit;
}
?>
文件上传功能:
public function addPost($user_id,$status,$file_path){
$query = $this->_db->prepare("INSERT INTO postsinitial (puid, pstatus, postimg) VALUES (:k, :l, :m)");
$query->bindValue(':k',$user_id);
$query->bindValue(':l', nl2br(htmlentities($status, ENT_QUOTES, 'UTF-8')));
$query->bindValue(':m',$file_path);
$query->execute();
$rsizes = $query->rowCount();
if ($rsizes > 0) {
return true;
}
else
{
return false;
}
}
我尝试编写代码以将每个文件路径插入为逗号分隔的值数组,以便用户可以上传多张图像以仅在 database.This 中记录一条记录很重要!
提前发送!
foreach 看起来不太正确。在 uploadfile.php 中尝试使用此代码段代替 foreach 部分。它构建你的循环有点不同,检查 tmp_name 看看循环是否应该继续。
if(isset($_POST['psubmit']))
{
$imagearray = array();
for ($i = 0; $_FILES['pfile']['tmp_name'][$i] $i++)
{
$pfname = $_FILES["pfile"]['name'][$i];
$pftype = $_FILES['pfile']['type'][$i];
$pfsize = $_FILES['pfile']['size'][$i];
$pftmploc = $_FILES['pfile']['tmp_name'][$i];
$pferror = $_FILES['pfile']['error'][$i];
$blast = explode(".", $pfname);
$pfextn = end($blast);
array_push($imagearray, $pfname);
if (!empty($ps) && empty($pfname))
{ ...
看来你的逻辑有误。您必须在遍历 $_FILES 数组的同一个 foreach() 中执行 move_uploaded_file() 。
...
echo "ERROR: An error occured while processing the file. Try again.";
exit();
}
}
move_uploaded_file(...
}
您所做的是尝试使用 $pftmploc 变量作为临时文件路径在单独的 foreach 块中执行 move_uploaded_file()。但由于该变量是在前面的 foreach() 循环中分配的,因此它代表上传文件数组的最后一个元素。这就是为什么您没有上传所有文件的原因。