Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 需要帮助更改成功文件上载的代码,并取消文件上载_Php_Jquery_Mysql_Ajax_Pdo - Fatal编程技术网

Php 需要帮助更改成功文件上载的代码,并取消文件上载

Php 需要帮助更改成功文件上载的代码,并取消文件上载,php,jquery,mysql,ajax,pdo,Php,Jquery,Mysql,Ajax,Pdo,当我试图取消上传时,我的“取消”按钮出现问题,我需要一些帮助,可能需要稍微更改代码的设计 问题: 在运行“audioupload.php”脚本之前,“cancelaudio.php”页面没有它需要的信息。这是一种本末倒置的局面。如果客户端在HTTP请求期间单击取消按钮,“audioupload.php”脚本(在服务器端)将永远不会执行。但是jQuery中的客户端活动仍然可以运行 我想要实现的解决方案: 客户机填写表单并提交表单,产生POST请求,并附带文件。POST请求可能需要几秒钟才能完成,具

当我试图取消上传时,我的“取消”按钮出现问题,我需要一些帮助,可能需要稍微更改代码的设计

问题:

在运行“audioupload.php”脚本之前,“cancelaudio.php”页面没有它需要的信息。这是一种本末倒置的局面。如果客户端在HTTP请求期间单击取消按钮,“audioupload.php”脚本(在服务器端)将永远不会执行。但是jQuery中的客户端活动仍然可以运行

我想要实现的解决方案:

客户机填写表单并提交表单,产生POST请求,并附带文件。POST请求可能需要几秒钟才能完成,具体取决于文件大小、连接速度等

只有在所有文件的HTTP上传完成后,PHP才能获得控制权。服务器上的PHP“action”脚本通过POST方法请求获得控制权。如果在上载过程中发生任何错误,将使用正确的代码加载$\u文件['error']。此时,您可以检查$\文件中的值,移动$\上传的$\文件(),将文件名加载到$\会话数组中,等等

总之,如果人类客户端在POST请求处理过程中(或在开始上传之前)单击“取消按钮”,导致文件上传被取消,那么处理上传的PHP“操作”脚本将永远无法得到控制。服务器从来没有机会移动上载的文件并将变量加载到数据库或会话数组中

我只需要帮助编码的问题,以便能够达到解决方案。有人能帮忙吗?以下是必要的代码:

AUDIOUPLOAD.PHP

<?php
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("ii",$lastAudioID, $qnum); 

$insertaudioquestion->execute(); 

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

$insertaudioquestion->close(); 



?>
用jquery试试这个:

$(".audioCancel").live("click", function(){
      var file = $(".fileAudio").val();
      var canc = "Cancel";
     $.post("CANCELAUDIO.PHP", {file:file,canc:canc}, function(result){
         alert(result);
         window.location.reload();     
     });

});
然后在php中添加以下内容:

$file = $_POST["file"];
$canc = $_POST["canc"];
if($canc){
    unlink("AudioFiles/" . $canc);  
}else{
    unlink("AudioFiles/" . $_SESSION['AudioFile']);  
}
也可以尝试以下方法:

启用session.upload_progress.enabled INI选项后,PHP将能够跟踪正在上载的各个文件的上载进度。这些信息对于实际的上传请求本身并不特别有用,但在文件上传过程中,应用程序可以向单独的端点发送POST请求(例如通过XHR)以检查状态

上载正在进行,并且发布与会话同名的变量时,$\u会话超全局将提供上载进度。upload\u progress.name INI设置设置为。当PHP检测到此类POST请求时,它将在$\u会话中填充一个数组,其中索引是SESSION.upload\u progress.prefix和SESSION.upload\u progress.name INI选项的串联值。通常通过读取这些INI设置来检索密钥,即

<?php
$key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];
var_dump($_SESSION[$key]);
?>

还可以通过将$\u SESSION[$key][“cancel\u upload”]键设置为TRUE来取消当前正在进行的文件上载。在同一请求中上载多个文件时,这只会取消当前正在进行的文件上载和挂起的文件上载,但不会删除成功完成的上载。当像这样取消上载时,$\u FILES数组中的错误键将设置为upload\u ERR\u EXTENSION


首先,您可以尝试访问有关会话上载进度的链接,这将向您展示如何在不终止会话的情况下停止上载进度:)

您可以尝试终止MySQL连接,然后重新打开它,我想这将是停止连接的一种方法。。。我假设如果您将代码与“取消”按钮结合使用(例如onclick->blah blah coding blah),您可以取消连接,然后在连接终止后返回它

这里有一个链接->

在这之后,只需编写一行简单的代码来开始运行操作脚本(指向需要运行的函数),这将允许您继续运行脚本,而不会丢失所需的会话


顺便说一句,我不完全确定这会起作用。。。逻辑思考:P…

好的,我会根据我的理解尝试一些东西

用户使用表单提交文件。这可能需要一些时间,因此当用户单击“取消”时,可能出现两种情况:

  • 表单(及其数据,即文件内容)仍由浏览器发送,尚未完成上载。在这种情况下,您所要做的就是取消表单提交。要求浏览器停止它。 这样,
    audioupload.php
    将永远不会执行,您不需要通过调用
    cancelaudio.php
    来删除它

  • 当浏览器完成文件上传/表单提交时,服务器仍在处理数据且尚未响应您的短时间内。在这种情况下,上传的文件可能会保存,也可能不会保存(我们不知道)。您需要调用
    cancelaudio.php
    页面将其从硬盘中删除

  • 这两种情况中只有一种是正确的,但您可以同时执行这两种操作,因为它们都不会与另一种冲突

    第一个案例的答案在这里(因为您正在使用
    提交表单):


    第二种情况的另一种情况是始终对
    cancelaudio.php
    进行Ajax调用,以防文件已被处理和保存,但我们尚未收到通知(时间很短,但仍有可能发生)。

    我假设这是一些学校作业,因为我刚刚帮助了你的一个(大概是这样)同学们。虽然你的方法似乎有点不同,但你仍然可以从中得到一些想法。这是一个完全不同的问题,即使你做了所有的解释,我也不明白你想要什么。例如:当客户点击“取消”时,你想做什么jQuery中的客户端活动仍然会运行”(这对您来说是个什么问题)?您是否可以尝试通过以下链接使用或其他类似的uploaderGo,类似的问题discu
    $(".audioCancel").live("click", function(){
          var file = $(".fileAudio").val();
          var canc = "Cancel";
         $.post("CANCELAUDIO.PHP", {file:file,canc:canc}, function(result){
             alert(result);
             window.location.reload();     
         });
    
    });
    
    $file = $_POST["file"];
    $canc = $_POST["canc"];
    if($canc){
        unlink("AudioFiles/" . $canc);  
    }else{
        unlink("AudioFiles/" . $_SESSION['AudioFile']);  
    }
    
    <?php
    $key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];
    var_dump($_SESSION[$key]);
    ?>