3

アップロードをキャンセルしようとするとキャンセルボタンに問題があり、コードのデザインを少し変更するのに助けが必要です。

問題:

「cancelaudio.php」ページには、「audioupload.php」スクリプトが実行されるまで、必要な情報がありません。それはカートと馬の状況です。HTTPリクエスト中にクライアントがキャンセルボタンをクリックした場合、「audioupload.php」スクリプト(サーバー側)は実行されません。ただし、jQueryのクライアント側のアクティビティは引き続き実行されます。

私が達成したい解決策:

クライアントがフォームに入力して送信すると、ファイルが添付されたPOSTリクエストが生成されます。ファイルのサイズ、接続の速度などによっては、POSTリクエストが完了するまでに数秒かかる場合があります。

すべてのファイルのHTTPアップロードが完了した後でのみ、PHPが制御を取得します。サーバー上のPHPの「アクション」スクリプトは、POSTメソッドリクエストを介して制御を取得します。アップロード中にエラーが発生した場合、$ _FILES['error']に正しいコードが読み込まれます。この時点で、$ _ FILES、move_uploaded_file()の値を確認したり、ファイル名を$_SESSION配列にロードしたりできます。

つまり、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(); 



?>

CANCELAUDIO.PHP

<?php

 // 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']);  
 
$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(); 
   
  
?>

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() + "' />
    
<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コード:

function startAudioUpload(audiouploadform){
  $(audiouploadform).find('.audiof1_upload_process').css('visibility','visible');
  $(audiouploadform).find('.audiof1_cancel').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(2);
    });
  
      return true;
}
4

3 に答える 3

2

まず、セッションのアップロードの進行状況に関するこのリンクにアクセスしてみてください。これは、セッションを強制終了せずにアップロードの進行を停止する方法を示しているはずです:)

PHP: セッションのアップロードの進行状況

MySQL接続を強制終了してから再度開くことができます。これは接続を停止する1つの方法だと思います...キャンセルボタンと組み合わせてコードを使用すると仮定します(たとえば、onclick->何とか何とかコーディング)接続をキャンセルして、接続が終了したら元に戻すことはできますか?

ここにリンクがあります-> PHP: MySQL_close

この後、単純なコード行を記述してアクション スクリプトの実行を開始します (実行する必要がある関数を指定します)。これにより、必要なセッションを失うことなく、スクリプトの実行を続行できます。

ps。これが機能するかどうかは完全にはわかりません...論理的に考えているだけです:P ...

于 2012-10-29T11:48:18.267 に答える
0

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を介して)ステータスを確認できます。

アップロードの進行状況は、アップロードが進行中の場合、およびsession.upload_progress.name INI設定と同じ名前の変数をPOSTする場合に、$_SESSIONスーパーグローバルで使用できます。PHPがそのようなPOST要求を検出すると、$ _ SESSIONに配列を設定します。ここで、インデックスは、session.upload_progress.prefixおよびsession.upload_progress.nameINIオプションの連結値です。キーは通常、これらのINI設定を読み取ることによって取得されます。

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

$ _SESSION [$ key] ["cancel_upload"]キーをTRUEに設定することにより、現在進行中のファイルのアップロードをキャンセルすることもできます。同じリクエストで複数のファイルをアップロードする場合、これにより、現在進行中のファイルアップロードと保留中のファイルアップロードのみがキャンセルされ、正常に完了したアップロードは削除されません。このようにアップロードをキャンセルすると、$_FILES配列のエラーキーがUPLOAD_ERR_EXTENSIONに設定されます。

http://php.net/manual/en/session.upload-progress.php

于 2012-10-26T19:15:15.127 に答える
0

わかったことから何かを試してみます。

ユーザーはフォームを使用してファイルを送信します。これには時間がかかる場合があるため、ユーザーが [キャンセル] をクリックすると、次の 2 つのケースが考えられます。

  1. フォーム (およびそのデータ、つまりファイルの内容) はまだブラウザによって送信されており、アップロードが完了していません。その場合は、フォームの送信をキャンセルするだけです。ブラウザに停止を依頼してください。そうすれば、audioupload.phpは決して実行されず、 を呼び出して削除する必要がなくなりますcancelaudio.php

  2. ブラウザがファイルのアップロード/フォームの送信を完了したとき、サーバーがまだデータを処理していて、まだ応答していない短い時間枠があります. その場合、アップロードされたファイルは保存される場合と保存されない場合があります (わかりません)。cancelaudio.phpページを呼び出して、ハード ドライブからファイルを削除する必要があります。

2 つのケースのうち 1 つだけが true になりますが、他のアクションと競合するものがないため、両方のアクションを実行できます。

最初のケースに対する答えはここにあります (<iframe>フォームの送信に を使用しているため):非表示の iframe を使用するファイルのアップロードをキャンセルすることは可能ですか?

2 番目のケースに対する答えはcancelaudio.php、ファイルが処理されて保存されたが通知を受けていない場合に備えて、常に への Ajax 呼び出しを行うことです (時間枠は短いですが、それでも発生する可能性があります)。

于 2012-10-29T16:25:16.370 に答える