这里有一点我想尝试取消文件的上传。我所做的是,如果用户点击“取消”按钮,它将只删除iframe,使其不会转到将文件上传到服务器并将数据插入数据库的页面。 / p>
现在这可以正常工作,如果用户点击“取消”按钮,我已经意识到的问题是,如果用户很晚点击“取消”按钮,它有时不会删除iframe时间意味着文件刚刚在用户点击“取消”按钮之前上传。
所以我的问题是,如果文件在用户点击“取消”按钮之前以某种方式上传,它会删除数据库中的数据并从服务器中删除文件吗?
以下是图片上传表单:
<form action="imageupload.php" method="post" enctype="multipart/form-data" target="upload_target_image" onsubmit="return imageClickHandler(this);" class="imageuploadform" >
<p class="imagef1_upload_process" align="center">
Loading...<br/>
<img src="Images/loader.gif" />
</p>
<p class="imagef1_upload_form" align="center">
<br/>
<span class="imagemsg"></span>
<label>Image File: <input name="fileImage" type="file" class="fileImage" /></label><br/>
<br/>
<label class="imagelbl"><input type="submit" name="submitImageBtn" class="sbtnimage" value="Upload" /></label>
</p>
<p class="imagef1_cancel" align="center">
<input type="reset" name="imageCancel" class="imageCancel" value="Cancel" />
</p>
<iframe class="upload_target_image" name="upload_target_image" src="#" style="width:0px;height:0px;border:0px;solid;#fff;"></iframe>
</form>
以下是控制“取消”按钮的jquery函数:
$(imageuploadform).find(".imageCancel").on("click", function(event) {
$('.upload_target_image').get(0).contentwindow
$("iframe[name='upload_target_image']").attr("src", "javascript:'<html></html>'");
return stopImageUpload(2);
});
下面是php代码,它上传文件并将数据插入数据库。上面的表单发布到这个php页面“imageupload.php”:
<body>
<?php
include('connect.php');
session_start();
$result = 0;
//uploads file
move_uploaded_file($_FILES["fileImage"]["tmp_name"],
"ImageFiles/" . $_FILES["fileImage"]["name"]);
$result = 1;
//set up the INSERT SQL query command to insert the name of the image file into the "Image" Table
$imagesql = "INSERT INTO Image (ImageFile)
VALUES (?)";
//prepare the above SQL statement
if (!$insert = $mysqli->prepare($imagesql)) {
// Handle errors with prepare operation here
}
//bind the parameters (these are the values that will be inserted)
$insert->bind_param("s",$img);
//Assign the variable of the name of the file uploaded
$img = 'ImageFiles/'.$_FILES['fileImage']['name'];
//execute INSERT query
$insert->execute();
if ($insert->errno) {
// Handle query error here
}
//close INSERT query
$insert->close();
//Retrieve the ImageId of the last uploded file
$lastID = $mysqli->insert_id;
//Insert into Image_Question Table (be using last retrieved Image id in order to do this)
$imagequestionsql = "INSERT INTO Image_Question (ImageId, SessionId, QuestionId)
VALUES (?, ?, ?)";
//prepare the above SQL statement
if (!$insertimagequestion = $mysqli->prepare($imagequestionsql)) {
// Handle errors with prepare operation here
echo "Prepare statement err imagequestion";
}
//Retrieve the question number
$qnum = (int)$_POST['numimage'];
//bind the parameters (these are the values that will be inserted)
$insertimagequestion->bind_param("isi",$lastID, 'Exam', $qnum);
//execute INSERT query
$insertimagequestion->execute();
if ($insertimagequestion->errno) {
// Handle query error here
}
//close INSERT query
$insertimagequestion->close();
?>
<!--Javascript which will output the message depending on the status of the upload (successful, failed or cancelled)-->
<script>
window.top.stopImageUpload(<?php echo $result; ?>, '<?php echo $_FILES['fileImage']['name'] ?>');
</script>
</body>
更新:
下面是php代码“cancelimage.php”,我想从服务器中删除已取消的文件并从数据库中删除记录。它已设置但尚未完成,有人可以完成它所以我可以使用$ _SESSION检索文件的名称和它的ID吗?
<?php
// connect to the database
include('connect.php');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
die();
}
//remove file from server
unlink("ImageFiles/...."); //need to retrieve file name here where the ... line is
//DELETE query statement where it will delete cancelled file from both Image and Image Question Table
$imagedeletesql = " DELETE img, img_q
FROM Image AS img
LEFT JOIN Image_Question AS img_q
ON img_q.ImageId = img.ImageId
WHERE img.ImageFile = ?";
//prepare delete query
if (!$delete = $mysqli->prepare($imagedeletesql)) {
// Handle errors with prepare operation here
}
//Dont pass data directly to bind_param store it in a variable
$delete->bind_param("s",$img);
//execute DELETE query
$delete->execute();
if ($delete->errno) {
// Handle query error here
}
//close query
$delete->close();
?>
您能否在答案中提供示例代码,以便我更轻松。谢谢
答案 0 :(得分:1)
自从您使用PDO以来,您可以使用:
$insert->rollBack();
回滚最近的插入内容。并找到上传的文件并使用:
unlink('test.html');
查看这些链接,了解有关rollBack
和unlink
答案 1 :(得分:0)
如果删除iframe
并且没有调用告诉上传哪个文件的回调,那么很难知道要删除哪个文件。
虽然您可以在$lastID
中存储上次上传文件的$ImageFile
和$_SESSION
,并请求在数据库中查找文件的其他页面中删除记录,然后从磁盘中删除该文件。
我可以提供一些示例代码,但我的建议是您修改当前代码,使其更具可读性并修复缩进。
另一种解决方案是使用以下函数显式中止上传:
function abortUpload(){
var iframeObj = $("iframe[name='upload_target_image']").get(0);
if (iframeObj.contentWindow.document.execCommand){
// IE
iframeObj.contentWindow.document.execCommand('Stop');
}else{
// other browsers
iframeObj.contentWindow.stop();
}
}
答案 2 :(得分:0)
好的,就像我之前的回答中所说,您可以使用$_SESSION
来存储$lastID
和$ImageFile
。
$lastID = $mysqli->insert_id;
之后插入以下内容:$_SESSION['lastID'] = $lastID;
$_SESSION['ImageFile'] = $_FILES["fileImage"]["name"];
这会将lastID
和ImageFile
存储在会话中。
cancelimage.php
{h}>中放入以下内容:
unlink("ImageFiles/" . $_SESSION['ImageFile']);
$delete = $mysqli->prepare('DELETE FROM Image WHERE id = ?');
$delete->bind_param("i",$_SESSION['lastID']);
$delete->execute();
cancelimage.php
但存在风险,因为如果用户之前已上传文件,则上传新文件但文件未通过(因此会话变量未设置),则先前的文件将被删除。