Php 包括多个文件上载的注释
我上传多个文件时遇到问题。我有一个类别下拉列表和一个注释框,我需要将其与文件详细信息一起插入数据库。我有五个上传框显示在屏幕上 如果我上传一个文件,则注释为空(即使不应该为空),并且类别始终设置为第一个值。经过一些测试后,最终的上传评论和分类框似乎覆盖了所有的内容。通过上传五个不同类别和评论的文件进行测试,所有文件都显示了最后的评论和类别 我可以看到脚本中的问题,但我不知道如何为上传的每个特定实例分配类别或注释 感谢您的帮助Php 包括多个文件上载的注释,php,html,file-upload,Php,Html,File Upload,我上传多个文件时遇到问题。我有一个类别下拉列表和一个注释框,我需要将其与文件详细信息一起插入数据库。我有五个上传框显示在屏幕上 如果我上传一个文件,则注释为空(即使不应该为空),并且类别始终设置为第一个值。经过一些测试后,最终的上传评论和分类框似乎覆盖了所有的内容。通过上传五个不同类别和评论的文件进行测试,所有文件都显示了最后的评论和类别 我可以看到脚本中的问题,但我不知道如何为上传的每个特定实例分配类别或注释 感谢您的帮助 <?php $upload_dir =
<?php
$upload_dir = "training/trainingDocuments/";
$maxUploads = 5;
$msg = "Please select file(s) for uploading";
$errors = array();
if ( $files = convert_files( $_FILES["myTrainingFile"] ) ) {
foreach( $files as $i => $file ) {
$fileName = $file["name"];
$tempName = $file["tmp_name"];
$fileSize = $file["size"];
$fileExt = strtolower( pathinfo( $fileName, PATHINFO_EXTENSION ) );
$blacklist = array( 'exe','php','jsp','js','bat','asp','aspx','com','dmg' );
// $newPath = $upload_dir .$fileName;
$dateUploaded = time() . microtime();
if ( in_array( $fileExt, $blacklist ) ) {
$errors[$i] = "File type not allowed";
}
if ( !is_uploaded_file( $tempName ) ) {
//$errors[$i] = "Uploading ".$fileName." failed.";
}else{
echo '<h4>Uploading of :'.$fileName.' was a success.</h4>';
}
//if(file_exists($newPath)){
$name = pathinfo($fileName, PATHINFO_FILENAME);
$fileName = $name . '__' .uniqid(). '.' .$fileExt;
$newPath = $upload_dir .$fileName;
// }else{
//
// }
if ( isset( $errors[$i] ) ) {
continue;
}
if ( !move_uploaded_file( $tempName, $newPath ) ) {
//$errors[$i] = "Uploading ".$fileName." failed.";
}else{
//echo 'File moved';
}
$comments = htmlentities( trim( $_POST['comments'] ) );
$category = htmlentities( trim( $_POST['category'] ) );
if($file['name'] != ""){
$training->uploadDocument( $fileName, $category, $comments );
}
}
}
?>
<?php
function convert_files( $files ) {
if ( is_array( $files ) && !empty( $files["name"] ) ) {
if ( is_array( $files["name"] ) ) {
$merged = array();
foreach( $files["name"] as $i => $name ) {
$merged[] = array(
"name" => $name,
"type" => $files["type"][$i],
"size" => $files["size"][$i],
"error" => $files["error"][$i],
"tmp_name" => $files["tmp_name"][$i]
);
}
return $merged;
}
return array( $files );
}
return false;
}
?>
编辑:添加HTML
<div id="uploadFormContainer">
<form id="uploadForm" action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post" enctype="multipart/form-data">
<?php
$num = 0;
while($num < $maxUploads)
{?>
<div class="uploadFormE">
<label>File Category: </label>
<select name="category">
<option value="doc">Documents (pages, word, PDF etc)</option>
<option value="sheet">Spreadsheet</option>
<option value="vid">Video</option>
<option value="pres">Presentations</option>
<option value="img">Image</option>
<option value="quiz">Quiz</option>
<option value="other">Other</option>
</select>
</div>
<div class="uploadFormE">
<label>File Location: </label>
<input type="file" name="myTrainingFile[]" />
</div>
<div class="uploadFormE">
<label>Comments: </label>
<textarea class="GAH" name="comments"> </textarea>
</div>
<hr/>
<br />
<?php $num++;
}
?>
<input type="submit" value="Upload File(s)">
</form>
</div>
看看这是否有效。这适用于只有一个注释和类别的情况:
以这一部分为例:
$comments = htmlentities( trim( $_POST['comments'] ) );
$category = htmlentities( trim( $_POST['category'] ) );
在foreach循环之外:
if ( $files = convert_files( $_FILES["myTrainingFile"] ) ) {
foreach( $files as $i => $file ) {
因为您从上一页只获得一个注释和类别值,所以在foreach循环中不需要这个值。此外,如果要上载每个文件的注释和类别,则需要更改将值传递到此页面的上一个页面。如果您想要这样,那么您需要添加更多的代码
以下是OP添加更多代码后的更新:
更改此项:
<select name="category">
$comments = htmlentities( trim( $_POST['comments'] ) );
$category = htmlentities( trim( $_POST['category'] ) );
为此:
<select name="category[]">
<textarea class="GAH" name="comments[]"> </textarea>
$comments = htmlentities( trim( $_POST['comments'][$i] ) );
$category = htmlentities( trim( $_POST['category'][$i] ) );
这是基于假设$i是索引变量,其值在迭代文件数组时从0到4。如果不是这样,则需要添加另一个索引变量,如$count,如下所示:
$count = 0;
foreach( $files as $i => $file ) {
// your other code goes here
$comments = htmlentities( trim( $_POST['comments'][$count] ) );
$category = htmlentities( trim( $_POST['category'][$count] ) );
$count ++;
}
您是否需要对上传的每个文件进行评论和分类?@Maximus2012-最好是。好吧,分类是绝对必须的,评论不是一个巨大的考验,但最好是一个单页脚本Maximus,不确定这是否会产生巨大的差异,所有HTML和PHP代码都在这一页上。我需要做哪些更改才能对每个上传的文件进行评论和分类?我可以把它们附加到名称数组中吗?这是从哪里来的:$\u POST['comments']?如果它是一个单页脚本,那么你能发布该页面的全部代码吗?我会用额外的HTML更新这个问题。而且,我需要他们在循环中。training->uploadDocument函数调用将它们作为参数,需要在forEach中运行。非常感谢!!!最好的事情是现在知道我可以以这种方式使用数组。明亮的谢谢当然没问题。很高兴我能帮忙。
$count = 0;
foreach( $files as $i => $file ) {
// your other code goes here
$comments = htmlentities( trim( $_POST['comments'][$count] ) );
$category = htmlentities( trim( $_POST['category'][$count] ) );
$count ++;
}