【问题标题】:How to stop file being inserted into server [duplicate]如何停止将文件插入服务器[重复]
【发布时间】:2012-10-24 16:57:06
【问题描述】:

可能重复:
files get uploaded just before they get cancelled

我遇到了取消文件上传的情况。假设发生的情况是,如果用户单击“取消”按钮,那么它将转到下面的脚本并从服务器中删除文件并从数据库中删除文件的记录:

cancelaudio.php

<?php
session_start();
 // connect to the database
 include('connect.php');

  /* check connection */
  if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    die();
  }

  unlink("AudioFiles/" . $_SESSION['AudioFile']);  //undefined notice

$delete = $mysqli->prepare('DELETE FROM Audio WHERE AudioId = ?'); 
$delete->bind_param("i",$_SESSION['lastAudioID']); 
$delete->execute(); 

$deleteaud = $mysqli->prepare('DELETE FROM Audio_Question WHERE AudioId = ?'); 
$deleteaud->bind_param("i",$_SESSION['lastAudioID']); 
$deleteaud->execute(); 


?>

这就是我现在的情况:

如果我清理了我的 cookie,这显然意味着我没有文件存储我的 $_SESSION 变量。现在,如果我尝试上传文件(第一个文件)然后取消它,那么我会收到“AudioFile”的未定义索引通知。这很公平,因为显然我没有文件存储在 $_SESSION 变量中。但问题是它没有执行上面代码中的 unlink() 和 DELETE 语句,所以它会显示文件的记录并仍然上传它。

所以发生的情况是,直到我在服务器中有一个文件并在 $_SESSION['AudioFile'] 中存储了一个文件,它不会从服务器中删除该文件,并且会从数据库中删除该记录.

所以我的问题是,如果$_SESSION['AudioFile'] 中没有文件并且用户上传然后取消文件,我该怎么做才能阻止它将文件插入服务器和插入数据库记录?

以下是上传文件并将数据插入数据库的代码:

audioupload.php

<?php

session_start();

ini_set('display_errors',1); 
error_reporting(E_ALL);
// connect to the database
include('connect.php');

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
die();
}

$result = 0;

if( file_exists("AudioFiles/".$_FILES['fileAudio']['name'])) {
$parts = explode(".",$_FILES['fileAudio']['name']);
$ext = array_pop($parts);
$base = implode(".",$parts);
$n = 2;

while( file_exists("AudioFiles/".$base."_".$n.".".$ext)) $n++;
$_FILES['fileAudio']['name'] = $base."_".$n.".".$ext;

move_uploaded_file($_FILES["fileAudio"]["tmp_name"],
"AudioFiles/" . $_FILES["fileAudio"]["name"]);
$result = 1;

}
else
{
move_uploaded_file($_FILES["fileAudio"]["tmp_name"],
"AudioFiles/" . $_FILES["fileAudio"]["name"]);
$result = 1;
}

$audiosql = "INSERT INTO Audio (AudioFile) 
VALUES (?)";

if (!$insert = $mysqli->prepare($audiosql)) {
// Handle errors with prepare operation here
}

//Dont pass data directly to bind_param store it in a variable
$insert->bind_param("s",$aud);

//Assign the variable
$aud = 'AudioFiles/'.$_FILES['fileAudio']['name'];

$insert->execute();

if ($insert->errno) {
// Handle query error here
}

$insert->close();

$lastAudioID = $mysqli->insert_id;   

$_SESSION['lastAudioID'] = $lastAudioID; 
$_SESSION['AudioFile'] = $_FILES["fileAudio"]["name"]; 


$audioquestionsql = "INSERT INTO Audio_Question (AudioId, QuestionId)  
VALUES (?, ?)"; 

if (!$insertaudioquestion = $mysqli->prepare($audioquestionsql)) { 
// Handle errors with prepare operation here 
echo "Prepare statement err audioquestion"; 
} 

$qnum = (int)$_POST['numaudio'];

$insertaudioquestion->bind_param("iii",$lastAudioID, $qnum); 

$insertaudioquestion->execute(); 

if ($insertaudioquestion->errno) { 
// Handle query error here 
} 

$insertaudioquestion->close(); 



?>

下面是文件输入的 HTML 表单:

<form action='audioupload.php' method='post' enctype='multipart/form-data' target='upload_target_audio' onsubmit='return audioClickHandler(this);' class='audiouploadform' > 

Audio File: <input name='fileAudio' type='file' class='fileAudio' /></label><br/><br/><label class='audiolbl'> 

<input type='submit' name='submitAudioBtn' class='sbtnaudio' value='Upload' /></label>

<input type='hidden' class='numaudio' name='numaudio' value='" + GetFormAudioCount() + "' />

<label><input type='reset' name='audioCancel' class='audioCancel' value='Cancel' /></label>

<iframe class='upload_target_audio' name='upload_target_audio' src='#' style='width:300px;height:300px;border:0px;solid;#fff;'></iframe></form>

最后是 jquery 函数,如果用户在文件上传时单击“取消”按钮,它将简单地将 iframe 源更改为“cancelaudio.php”:

function startAudioUpload(audiouploadform){
$(audiouploadform).find('.audiof1_upload_process').css('visibility','visible');
$(audiouploadform).find('.audiof1_upload_form').css('visibility','hidden');
sourceAudioForm = audiouploadform;

$(audiouploadform).find(".audioCancel").on("click", function(event) {
$('.upload_target_audio').get(0).contentwindow
$("iframe[name='upload_target_audio']").attr("src", "cancelaudio.php");
return stopAudioUpload();
});

return true;
}

【问题讨论】:

  • @MarkBaker 您指的是不同的重复问题,在那个问题中,我问的是当用户单击取消之前刚刚上传的文件时,删除数据库行和删除文件的最佳方法是什么取消。这个问题是问在文件存储在会话中之前,如果我尝试取消文件上传,那么它仍然会将数据和文件插入服务器

标签: php pdo mysqli


【解决方案1】:

要摆脱未定义的索引内容,并使脚本更加健壮,您应该添加错误检查。即使是简单的

if ($_FILES['fileAudio']['error'] === UPLOAD_ERR_OK) {
   ... successful upload ...
}

会减少很多问题。现在,您的代码只是假设上传成功,甚至无需检查是否已尝试上传事件。

这里定义了各种失败的错误代码:http://php.net/manual/en/features.file-upload.errors.php

【讨论】:

  • 好的,我会对此进行测试,然后再告诉您结果。谢谢:)
  • 这段代码是否应该进入“audioupload.php”页面,因为我已经这样做了,但是当我尝试在空后取消第一个文件上传时,它仍然会将数据插入数据库并将文件存储在服务器中$_SESSION['AudioFile'] 我仍然在 cancelaudio.php 页面中得到 AudioFile 的未定义索引
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2014-04-25
  • 2014-07-30
  • 2014-01-14
  • 2014-12-15
  • 2012-02-27
  • 2017-06-14
相关资源
最近更新 更多