この記事では主に Ajax アップロード ファイル プログレス バー Codular の関連情報を紹介します。必要な友人はそれを参照してください。
現在、人々は Web ページを離れることなく Web を閲覧しながら他のことを行うことを好みます。これは通常、Ajax を通じて実現されます。 . ほとんどの場合、これを実現するために jQuery を使用しますが、ブラウザの進歩により、ページを離れることなくサーバーにファイルをアップロードする方法を紹介します。前に行ったものと同じ方法です。この記事で使用したのと同じバックエンド PHP コードを使用して、ファイルをサーバーにアップロードし、アップロードの進行状況を表示し、場合によっては、アップロードされたファイルのリンク アドレスを返します。アップロードされたファイルの ID またはその他のアプリケーション情報を返すため、注: このコードは古い IE ブラウザーをサポートしていません。IE10+ のみをサポートしています
まず HTML 構造から始めます。 JavaScript と、PHP コードが提供されます。この部分は前のチュートリアルから改変されたものです。PHP コードについてはあまり説明しません。
HTML
2 つの入力ボックスを使用するだけで済みます。1 つはファイル タイプ ファイルで、もう 1 つは単なるボタン ボタンであり、ファイル アップロード リクエストを送信するためにクリックされるのをリッスンできます。 また、アップロードのステータスを強調表示するために幅を変更する p もあります。
以下に示すように:<!doctype html> <html> <head> <meta charset="utf-8"> <title>JS File Upload with Progress</title> <style> .container { width: 500px; margin: 0 auto; } .progress_outer { border: 1px solid #000; } .progress { width: 20%; background: #DEDEDE; height: 20px; } </style> </head> <body> <p class='container'> <p> Select File: <input type='file' id='_file'> <input type='button' id='_submit' value='Upload!'> </p> <p class='progress_outer'> <p id='_progress' class='progress'></p> </p> </p> <script src='upload.js'></script> </body> </html>
JavaScript
まず、以下を取得する必要があります。使用されるタグはすでに ID でマークされています
var _submit = document.getElementById('_submit'), _file = document.getElementById('_file'), _progress = document.getElementById('_progress');
_submit.addEventListener('click', upload);
ファイル入力box_fileには、選択したファイルキューをクエリするためのパラメータファイルがあります。複数のパラメータを設定すると、複数のファイルを選択できます。チェックして判断し、配列の長さが 0 より大きい場合は続行し、それ以外の場合は直接戻ります。
if(_file.files.length === 0){ return; }
動的作成 送信するファイルデータ
このためには、FormData を使用してそれにデータを追加する必要があります。次に、手順 3 で生成されたリクエストで FormData を送信できます。私たちが使用する append メソッド、最初のパラメーター 入力ボックスの name 属性と同様に、2 番目のパラメーターは値です。ここでは、選択した最初のファイルに値を設定します。
var data = new FormData(); data.append('SelectedFile', _file.files[0]);
この部分は非常に基本的なもので、リクエストのステータスが変化したときにコールバック関数を定義するための新しい 値を作成します。このメソッドはステータスが変化したときに readyState をチェックして、値は必要なものです - この例では 4 です。これはリクエストが完了したことを意味します
2 番目のステップでは、アップロードの進行状況を取得して使用できます。var request = new XMLHttpRequest(); request.onreadystatechange = function(){ if(request.readyState == 4){ try { var resp = JSON.parse(request.response); } catch (e){ var resp = { status: 'error', data: 'Unknown error occurred: [' + request.responseText + ']' }; } console.log(resp.status + ': ' + resp.data); } };
XMLHttpRequest
,并设置一些设置。首先我们将修改onreadystatechange
リクエストが成功したら、try...catch を使用して戻り値を解析するプロセスをラップします。解析が失敗した場合は、後続のコードが実行されるように独自の戻りオブジェクトを作成します。エラーを報告しません。戻り値を処理する方法を決定できます。ここではコンソールに出力されます。次に、プログレスバーを扱います。request.upload.addEventListener('progress', function(e){ _progress.style.width = Math.ceil(e.loaded/e.total) * 100 + '%'; }, false);
ここでは少し複雑です。イベント オブジェクトには、より重要な 2 つの属性があり、サーバーにアップロードされた値を示します。Total は、これら 2 つに基づいて割合を計算できます。値を使用して進行状況バーの幅を設定します。注: ここではアニメーション効果は追加されませんが、必要に応じてカスタマイズできます。アニメーション効果。
ファイルをアップロードしていますこれでリクエストを送信できます。 request.open('POST', 'upload.php');
request.send(data);
var _submit = document.getElementById('_submit'), _file = document.getElementById('_file'), _progress = document.getElementById('_progress'); var upload = function(){ if(_file.files.length === 0){ return; } var data = new FormData(); data.append('SelectedFile', _file.files[0]); var request = new XMLHttpRequest(); request.onreadystatechange = function(){ if(request.readyState == 4){ try { var resp = JSON.parse(request.response); } catch (e){ var resp = { status: 'error', data: 'Unknown error occurred: [' + request.responseText + ']' }; } console.log(resp.status + ': ' + resp.data); } }; request.upload.addEventListener('progress', function(e){ _progress.style.width = Math.ceil(e.loaded/e.total) * 100 + '%'; }, false); request.open('POST', 'upload.php'); request.send(data); } _submit.addEventListener('click', upload);
PHP に...
PHPこれは私たちが使用しているコードです。いくつかの違いに気づくでしょう。主に上部で JSON メソッドを使用しています。戻り値は JSON 形式で出力されます。この PHP は、これは、このメソッドが 500Kb 未満の PNG 画像にのみ適用できることを意味します。さらに、成功メッセージはアップロードされたファイルのパスを返します: <?php
// Output JSON
function outputJSON($msg, $status = 'error'){
header('Content-Type: application/json');
die(json_encode(array(
'data' => $msg,
'status' => $status
)));
}
// Check for errors
if($_FILES['SelectedFile']['error'] > 0){
outputJSON('An error ocurred when uploading.');
}
if(!getimagesize($_FILES['SelectedFile']['tmp_name'])){
outputJSON('Please ensure you are uploading an image.');
}
// Check filetype
if($_FILES['SelectedFile']['type'] != 'image/png'){
outputJSON('Unsupported filetype uploaded.');
}
// Check filesize
if($_FILES['SelectedFile']['size'] > 500000){
outputJSON('File uploaded exceeds maximum upload size.');
}
// Check if the file exists
if(file_exists('upload/' . $_FILES['SelectedFile']['name'])){
outputJSON('File with that name already exists.');
}
// Upload file
if(!move_uploaded_file($_FILES['SelectedFile']['tmp_name'], 'upload/' . $_FILES['SelectedFile']['name'])){
outputJSON('Error uploading file - check destination is writeable.');
}
// Success!
outputJSON('File uploaded successfully to "' . 'upload/' . $_FILES['SelectedFile']['name'] . '".', 'success');
関連記事:
Ajax フォーム送信と Ajax パラメーター受け渡しメソッドを検証するための jQuery Validator メソッド (画像とテキストのチュートリアル)Ajaxクロスドメインリクエストの原理(画像とテキストチュートリアル)
以上がAjax アップロード ファイルの進行状況バー Codularの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。