ホームページ >バックエンド開発 >PHPチュートリアル >ajax php 複数ファイルのアップロード コード_PHP チュートリアル
<頭>
ajax php教程多文件上传代码
<スクリプト>
(関数(){
var d = ドキュメント、w = ウィンドウ;/**
* IDで要素を取得
*/
関数 get(要素){
if (要素の種類 == "文字列")
要素 = d.getelementbyid(要素);
戻り要素;
}/**
* イベントを dom 要素に添付します
*/
関数 addevent(el, type, fn){
if (w.addeventlistener){
el.addeventlistener(type, fn, false);
} else if (w.attachevent){
var f = function(){
fn.call(el, w.event);
};
el.attachevent('on' + type, f)
}
}
/**
* HTML チャンクから要素を作成して返します
*/
var toelement = function(){
var div = d.createelement('div');
戻り関数(html){
div.innerhtml = html;
var el = div.childnodes[0];
div.removechild(el);
戻ってください;
}
}();関数 hasclass(ele,cls){
return ele.classname.match(new regexp('(s|^)'+cls+'(s|$)'));
}
関数 addclass(ele,cls) {
if (!hasclass(ele,cls)) ele.classname += " "+cls;
}
関数 Removeclass(ele,cls) {
var reg = new regexp('(s|^)'+cls+'(s|$)');
ele.classname=ele.classname.replace(reg,' ');
}// jquery lib (http://jquery.com/) からコピーされた getoffset 関数
if (document.documentelement["getboundingclientrect"]){
// getboundingclientrect を使用してオフセットを取得します
// http://ejohn.org/blog/getboundingclientrect-is-awesome/
var getoffset = function(el){
var box = el.getboundingclientrect(),
doc = el.ownerdocument,
body = doc.body,
docelem = doc.documentelement,
// IE の場合
clienttop = docelem.clienttop || || body.clienttop || 0、
clientleft = docelem.clientleft || body.clientleft || 0、
// Internet Explorer 7 では getboundingclientrect プロパティは物理的なものとして扱われます
// 一方、他のものは論理的です。 ie8 のように、すべてを論理的にします。
ズーム = 1;
if (body.getboundingclientrect) {
varbound = body.getboundingclientrect();
ズーム = (bound.right -bound.left)/body.clientwidth;
}
if (ズーム > 1){
clienttop = 0;
clientleft = 0;
}
var top = box.top/zoom + (window.pageyoffset || docelem && docelem.scrolltop/zoom || body.scrolltop/zoom) - clienttop,
left = box.left/zoom + (window.pagexoffset|| docelem && docelem.scrollleft/zoom || body.scrollleft/zoom) - clientleft;
戻る{
トップ: トップ、
左: 左
};
}
} その他 {
// すべてのオフセットを追加してオフセットを取得します
var getoffset = function(el){
if (w.jquery){
return jquery(el).offset();
}
var 上 = 0、左 = 0;
やります{
トップ += el.オフセットトップ || 0;
左 += el.オフセット左 || 0;
}
while (el = el.offsetparent);
リターン{
左: 左、
トップ: トップ
};
}
}関数 getbox(el){
var 左、右、上、下;
var offset = getoffset(el);
left = offset.left;
トップ = オフセット.トップ;
右 = 左 + el.offsetwidth;
底部 = 上部 + el.offsetheight;
リターン{
左: 左、
右: そう、
トップ: トップ、
下:下
};
}/**
*クロスブラウザのマウス座標
*/
関数 getmousecoords(e){
// pagex/y は ie
ではサポートされていません // http://www.quirksmode.org/dom/w3c_css教程om.html
if (!e.pagex && e.clientx){
// Internet Explorer 7 では、一部のプロパティ (マウス座標) が物理的なプロパティとして扱われます
// 一方、他のものは論理 (オフセット) です。
var ズーム = 1;
var body = document.body;
if (body.getboundingclientrect) {
varbound = body.getboundingclientrect();
ズーム = (bound.right -bound.left)/body.clientwidth;
}戻る {
x: e.clientx / ズーム + d.body.scrollleft + d.documentelement.scrollleft,
y: e.clienty / ズーム + d.body.scrolltop + d.documentelement.scrolltop
};
}
リターン{
x: e.pagex、
y: e.pagey
};}
/**
* 関数は一意の ID を生成します
*/
var getuid = function(){
変数ID = 0;
戻り関数(){
return 'valumsajaxupload' + id++;
}
}();関数 filefrompath(file){
return file.replace(/.*(/|)/, "");
}関数 gettext(ファイル){
return (/[.]/.exec(file)) ? /[^.]+$/.exec(file.to lowercase()) : '';
}/**
* xhr オブジェクトを取得するクロスブラウザーの方法
*/
var getxhr = function(){
var xhr;
戻り関数(){
if (xhr) return xhr;
if (typeof xmlhttprequest !== '未定義') {
xhr = 新しい xmlhttprequest();
} その他 {
var v = [
"microsoft.xmlhttp",
"msxml2.xmlhttp.5.0",
"msxml2.xmlhttp.4.0",
"msxml2.xmlhttp.3.0",
「msxml2.xmlhttp.2.0」
];
for (var i=0; i 試してみてください{
xhr = 新しい activexobject(v[i]);
休憩;
} キャッチ (e){}
}
}xhr に戻る;
}
}();// ajaxupload を使用してください。 ajax_upload は次のバージョンで削除されます
ajax_upload = ajaxupload = function(ボタン, オプション){
if (button.jquery){
// jqueryオブジェクトが渡されました
ボタン = ボタン[0];
} else if (ボタンの種類 == "string" && /^#.*/.test(button)){
ボタン = ボタン.スライス(1);
}
ボタン = 取得(ボタン);
this._input = null;
this._button = ボタン;
this._disabled = false;
this._submitting = false;
// ボタンがクリックされると変数が true に変更されます
// 3 秒前 (Mac 上の Safari エラーを修正するために必要)
this._justclicked = false;
this._parentdialog = d.body;
if (window.jquery && jquery.ui && jquery.ui.dialog){
varparentdialog = jquery(this._button).parents('.ui-dialog');
if (parentdialog.length){
this._parentdialog = 親ダイアログ[0];
}
}
this._settings = {
// サーバー側のアップロード スクリプトの場所
アクション: 'upload.php'、
// ファイルアップロード名
名前: 'ユーザーファイル'、
// 送信する追加データ
データ: {}、
// ファイルが選択されたらすぐに送信します
自動送信: true、
// サーバーから返されると予想されるデータのタイプ。
// html と xml は自動的に検出されます。
// json データを応答として使用する場合にのみ役立ちます。
// その場合は「json」に設定します。
応答タイプ: false、
// safari を修正するサーバーサイド スクリプトの場所
// "connection: close" ヘッダーを返すハング問題
接続を閉じる: ''、
// マウスホバー時にボタンに適用されるクラス
ホバークラス: 'ホバー'、
// ユーザーがファイルを選択するとき、自動送信を無効にすると便利です
onchange: 関数(ファイル、拡張子){}、
// ファイルがアップロードされる前に呼び出されるコールバック
// アップロードをキャンセルするには false を返すことができます
onsubmit: 関数(ファイル、拡張子){},
// ファイルのアップロードが完了すると起動されます
// 警告!応答として「false」文字列を使用しないでください!
oncomplete: 関数(ファイル、応答) {}
};// ユーザーのオプションをデフォルトとマージします
for (オプションの変数 i) {
this._settings[i] = オプション[i];
}
this._createinput();
this._rerouteclicks();
}
// メソッドをクラスに割り当てます
ajaxupload.prototype = {
setdata : 関数(データ){
this._settings.data = データ;
}、
無効にする: function(){
this._disabled = true;
}、
有効にする: function(){
this._disabled = false;
}、
// インスタンスを削除します
破壊: function(){
if(this._input){
if(this._input.parentnode){
this._input.parentnode.removechild(this._input);
}
this._input = null;
}
}、
/**
* ボタンの上に非表示のファイル入力を作成します
*/
_createinput : function(){
var self = this;
var input = d.createelement("input");
input.setattribute('タイプ', 'ファイル');
input.setattribute('name', this._settings.name);
var スタイル = {
'位置' : '絶対'
、'マージン': '-5px 0 0 -175px'
、'パディング': 0
、'幅': '220px'
,'高さ': '30px'
、'fontsize': '14px'
、'不透明度': 0
,'カーソル': 'ポインタ'
,'表示': 'なし'
,'zindex' : 2147483583 //opera 9.0-9.2x でサポートされる最大 zindex
// 奇妙なことに、2147483647 を期待していました
// IE では動作しません:(
//,'方向' : 'ltr'
};
for (スタイルの変数 i){
input.style[i] = スタイル[i];
}
// 要素の不透明度が存在することを確認します
// (つまり、代わりにフィルターを使用します)
if ( ! (input.style.opacity === "0")){
input.style.filter = "alpha(opacity=0)";
}
this._parentdialog.appendchild(input);addevent(input, 'change', function(){
// 入力からファイル名を取得します
var file = filefrompath(this.value);
if(self._settings.onchange.call(self, file, gettext(file)) == false ){
戻る;
}
// 値が変更されたときにフォームを送信します
if (self._settings.autosubmit){
self.submit();
}
});
// safari の問題を修正
// 問題は、ファイル選択ダイアログが開く前に入力を放置した場合です
// ファイルはアップロードされません。
// ダイアログが開くのが遅い(シートダイアログなので開くのに時間がかかる)
// ボタンを押したままにしておいても大丈夫です。
// したがって、すぐに表示を none に変更すべきではありません
addevent(input, 'クリック', function(){
self.justclicked = true;
settimeout(function(){
// ダイアログが開くまで 3 秒待ちます
self.justclicked = false;
}、2500);
});
this._input = 入力;
}、
_rerouteclicks : 関数 (){
var self = this;
// つまり、このメソッドを使用すると「アクセスが拒否されました」エラーが表示されます
// 他のブラウザは click() を無視します
// addevent(this._button, 'click', function(e){
// self._input.click();
// });
var ボックス、dialogoffset = {top:0、left:0}、over = false;
addevent(self._button, 'mouseo教程ver', function(e){
if (!self._input || over) return;
オーバー = true;
box = getbox(self._button);
if (self._parentdialog != d.body){
ダイアログオフセット = getoffset(self._parentdialog);
}
});
// ボタン上でマウスアウトを使用することはできません
// 目に見えない入力が上にあるため
addevent(document, 'mousemove', function(e){
var input = self._input;
if (!input || !over) return;
if (self._disabled){
削除クラス(self._button, self._settings.hoverclass);
input.style.display = 'なし';
戻ります;
}
var c = getmousecoords(e);if ((c.x >= box.left) && (c.x (c.y >= box.top) && (c.y <= box.bottom)){
input.style.top = c.y - Dialogoffset.top + 'px';
input.style.left = c.x - Dialogoffset.left + 'px';
input.style.display = 'ブロック';
addclass(self._button, self._settings.hoverclass);
} その他 {
// マウスがボタンを離れた
オーバー = false;
var check = setinterval(function(){
) // 入力がクリックされただけの場合は非表示にしないでください
// Safari のバグを防ぐため
if (self.justclicked){
戻ります;
}
if ( !over ){
input.style.display = 'なし';
}
クリア間隔(チェック);
}、25);
removeclass(self._button, self._settings.hoverclass);
}
});
}、
/**
* 一意の名前で iframe を作成します
*/
_createiframe : function(){
// ユニークな名前
// gettime は返されることがあるため、使用できません
// Safari でも同じ値:(
var id = getuid();
// IE6 の「このページには安全なアイテムと安全でないアイテムの両方が含まれています」というプロンプトを削除します
// http://tinyurl.com/77w9wh
var iframe = toelement('');
iframe.id = id;
iframe.style.display = 'なし';
d.body.appendchild(iframe);
iframe を返します。
}、
/**
* ページを更新せずにファイルをアップロードします
*/
送信: function(){
var self = this、settings = this._settings;
if (this._input.value === ''){
// ファイルがありません
戻ります;
}
// 入力からファイル名を取得します
var file = filefrompath(this._input.value);// ユーザーイベントを実行します
if (! (settings.onsubmit.call(this, file, gettext(file)) == false)) {
// この送信用に新しい iframe を作成します
var iframe = this._createiframe();
// ユーザー関数が false を返した場合は送信しない
var form = this._createform(iframe);
form.appendchild(this._input);// アップロードが Safari でハングしないようにするためのちょっとしたハックです。これに電話してください
// アップロードが送信される直前。これは ajax 呼び出しを行います
// サーバーは、「connection: close」を含む空のドキュメントを返します
// ヘッダー。Safari にアクティブな接続を閉じるように指示します。
// http://blog.airbladesoftware.com/2007/8/17/note-to-self-prevent-uploads-hanging-in-safari
if (settings.closeconnection && /applewebkit|msie/.test(navigator.useragent)){
var xhr = getxhr();
// 同期接続をオープンします
xhr.open('get', settings.closeconnection, false);
xhr.send('');
}
form.submit();
d.body.removechild(form);
フォーム = null;
this._input = null;
// 新しい入力を作成します
this._createinput();
var todeleteflag = false;
addevent(iframe, 'load', function(e){
if (// サファリ用
iframe.src == "javascript:'%3chtml%3e%3c/html%3e';" ||
// ff の場合、つまり
iframe.src == "javascript:'';"){
// 初回は削除しないでください。
if(削除フラグ){
// ff3 のビジー状態を修正
settimeout( function() {
d.body.removechild(iframe);
}, 0);
}
戻ります;
}
var doc = iframe.contentdocument ? iframe.contentdocument : フレーム[iframe.id].document;// Opera 9.26 を修正
if (doc.readystate && doc.readystate != 'complete'){
// Opera は、load イベントを複数回起動します
// dom の準備がまだ整っていない場合でも
// この修正は他のブラウザには影響しません
戻ります;
}
// Opera 9.64 を修正
if (doc.body && doc.body.innerhtml == "false"){
// Opera 9.64 イベントが 2 回目に発生しました
// body.innerhtml が false から変更されたとき
// サーバー応答まで約1秒後
戻る;
}
var 応答;
if (doc.xmlドキュメント){
// レスポンスは XML ドキュメント、つまりプロパティです
応答 = doc.xmldocument;
} else if (doc.body){
// 応答は HTML ドキュメントまたはプレーンテキストです
応答 = doc.body.innerhtml;
if (settings.responsetype && settings.responsetype.to lowercase() == 'json'){
// ドキュメントが「application/javascript」として送信された場合、または
// 'text/javascript' の場合、ブラウザは教程のテキストを');
でラップします // タグを付けてコンテンツの HTML エンコードを実行します。 この場合、
// テキスト ノードから元のテキスト コンテンツを取得する必要があります
// 分解されたコンテンツを取得するための nodevalue プロパティ。
// ie6 は text/html のみを理解することに注意してください
if (doc.body.firstchild && doc.body.firstchild.nodename.touppercase() == 'pre'){
応答 = doc.body.firstchild.firstchild.nodevalue;
}
if (応答) {
応答 = window["eval"]("(" + 応答 + ")");
} その他 {
応答 = {};
}
}
} その他 {
// レスポンスは XML ドキュメントです
var 応答 = ドキュメント;
}
settings.oncomplete.call(self, file, response);
// 空のページをリロードして、メインページをリロードします
// 投稿を再送信しません。また、忘れずに
// フレームを削除します
todeleteflag = true;
// IE の混合コンテンツの問題を修正します
iframe.src = "javascript:'';";
});
} その他 {
// ユーザーが同じファイルを選択できるように入力をクリアします
// IE6 では動作しません
// this._input.value = '';
d.body.removechild(this._input);
this._input = null;
// 新しい入力を作成します
this._createinput();
}
}、
/**
* iframe に送信されるフォームを作成します
*/
_createform : function(iframe){
var settings = this._settings;
// ここでメソッド、enctype を指定する必要があります
// ie 6/7 ではこの属性をオンザフライで変更することは許可されていないためです
var form = toelement('
form.style.display = 'なし';
フォーム.アクション = 設定.アクション;
form.target = iframe.name;
d.body.appendchild(form);
// 各データキーの非表示の入力要素を作成します
for (settings.data の var prop){
var el = d.createelement("input");
el.type = 'hidden';
el.name = prop;
el.value = settings.data[prop];
form.appendchild(el);
}
返品フォーム;
}
};
})();
スクリプト>
<スクリプトタイプ="text/javascript">
window.onload = function(){
var obtn = document.getelementbyid("unloadpic");
var oshow = document.getelementbyid("アップロード名");
var oremind = document.getelementbyid("errorremind");
新しい ajaxupload(obtn,{
アクション:"file_upload.php",
名前:「アップロード」、
onsubmit:function(file,ext){
if(ext && /^(jpg|jpeg|png|gif)$/.test(ext)){
//ext是後缀名
obtn.value = "正在上传…";
obtn.disabled = "無効";
}その他{
ormind.style.color = "#ff3300";
oremind.innerhtml = "非サポート非图片格式!";
false を返します;
}
}、
oncomplete:function(file,response){
obtn.disabled = "";
obtn.value = "再上传一张图片";
ormind.innerhtml = "";
var newchild = document.createelement("li");
newchild.innerhtml = ファイル;
oshow.appendchild(newchild);
}
});
};
スクリプト>