2012-10-24 24 views
-1

可能重複:
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(); 


?> 

現在,這是我遇到的情況:

如果清潔我的餅乾,它的意思很明顯,我已經存儲在我的$ _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; 
} 
+0

@MarkBaker那你指的是不同的重複問題,在這個問題,我問什麼是刪除數據庫記錄和刪除文件最好的方法用戶點擊時在取消之前取消剛剛上傳的文件。這個問題是要求,在一個文件被存儲在一個會話之前,如果我嘗試取消文件上傳,那麼它仍然會將數據和文件插入服務器 – user1763986

回答

0

爲了擺脫你的未定義索引的東西,再加上讓你的腳本更健壯,你應該添加錯誤檢查。即使是簡單的

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

會減少很多你的問題。現在,您的代碼只需假定上傳成功,甚至無需檢查是否嘗試上傳事件。

失敗的各種錯誤代碼定義如下:http://php.net/manual/en/features.file-upload.errors.php

+0

好吧,我會測試這個並返回給你的結果。謝謝:) – user1763986

+0

了這碼假設去進入「audioupload.php」頁面,因爲我已經做到了這一點,但它仍然將數據插入到數據庫中並存儲在服務器上的文件時,我嘗試取消第一個文件上傳後空'$ _SESSION [ 'AudioFile']'我仍然在cancelaudio.php頁面中找到'AudioFile'的未定義索引 – user1763986