[解決済み] jQuery File Uploadプラグインの実装方法について教えてください。
質問
EDIT(2019年10月)です。
6年後、jQuery File Uploadは明らかにまだ人々を狂わせ続けています。ここでの回答でほとんど慰めを得られない場合は、次のようにしてみてください。 を検索してください。 で検索してみてください。面倒なことをする価値はありませんよ。
前の編集でUploadifyをお勧めしましたが、コメントで指摘されたように、彼らはもう無料版を提供していないようです。Uploadify は ということで 2013年です。
EDIT
これでもアクセスがあるようなので、結局どうしたかを説明します。結局、受け付けている回答のチュートリアルに沿って、プラグインを動作させることができました。 ただ、jQuery File Uploadは本当に面倒なので、もっとシンプルなファイルアップロードプラグインを探しているのであれば、[Uploadify](http://www.uploadify.com)を強くお勧めします。回答で指摘されているように、非商用利用のみ無料です。背景
blueimpの jQuery ファイルアップロード を使用して、ユーザーがファイルをアップロードできるようにしています。 アウトオブザボックスでは、完全に動作します セットアップの説明書に従ってください。しかし、私のウェブサイトでそれを実際に使用するために、私はいくつかのことを行うことができるようにしたい。
- 既存のページにアップローダーを含める。
- アップロードされるファイルのディレクトリを変更する
プラグインのファイルはすべてルート下のフォルダに配置されています。
試してみたのですが...
- デモ ページをルートに移動して、必要なスクリプトのパスを更新する
- UploadHandler.php ファイルの 'upload_dir' と 'upload_url' オプションを提案されたとおりに変更します。 ここで .
- デモのjavascriptの2行目のURLを変更する
いずれの場合も、プレビューは表示され、プログレスバーも実行されますが、ファイルのアップロードに失敗し、コンソールにこのエラーが表示されます。
Uncaught TypeError: Cannot read property 'files' of undefined
. プラグインのすべての部分がどのように動作するのか理解していないため、デバッグが困難になっています。
コード
デモページ内のjavascriptです。
$(function () {
'use strict';
// Change this to the location of your server-side upload handler:
var url = 'file_upload/server/php/UploadHandler.php',
uploadButton = $('<button/>')
.addClass('btn')
.prop('disabled', true)
.text('Processing...')
.on('click', function () {
var $this = $(this),
data = $this.data();
$this
.off('click')
.text('Abort')
.on('click', function () {
$this.remove();
data.abort();
});
data.submit().always(function () {
$this.remove();
});
});
$('#fileupload').fileupload({
url: url,
dataType: 'json',
autoUpload: false,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
maxFileSize: 5000000, // 5 MB
// Enable image resizing, except for Android and Opera,
// which actually support image resizing, but fail to
// send Blob objects via XHR requests:
disableImageResize: /Android(?!.*Chrome)|Opera/
.test(window.navigator.userAgent),
previewMaxWidth: 100,
previewMaxHeight: 100,
previewCrop: true
}).on('fileuploadadd', function (e, data) {
data.context = $('<div/>').appendTo('#files');
$.each(data.files, function (index, file) {
var node = $('<p/>')
.append($('<span/>').text(file.name));
if (!index) {
node
.append('<br>')
.append(uploadButton.clone(true).data(data));
}
node.appendTo(data.context);
});
}).on('fileuploadprocessalways', function (e, data) {
var index = data.index,
file = data.files[index],
node = $(data.context.children()[index]);
if (file.preview) {
node
.prepend('<br>')
.prepend(file.preview);
}
if (file.error) {
node
.append('<br>')
.append(file.error);
}
if (index + 1 === data.files.length) {
data.context.find('button')
.text('Upload')
.prop('disabled', !!data.files.error);
}
}).on('fileuploadprogressall', function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .bar').css(
'width',
progress + '%'
);
}).on('fileuploaddone', function (e, data) {
$.each(data.result.files, function (index, file) {
var link = $('<a>')
.attr('target', '_blank')
.prop('href', file.url);
$(data.context.children()[index])
.wrap(link);
});
}).on('fileuploadfail', function (e, data) {
$.each(data.result.files, function (index, file) {
var error = $('<span/>').text(file.error);
$(data.context.children()[index])
.append('<br>')
.append(error);
});
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
ドキュメントがないことに驚いています。変更するのは簡単なことのように思えますが。誰かがこれを行う方法を説明してくれるとありがたいのですが。
どのように解決するのですか?
私は数日前に同様の機能を探していて、tutorialzine で良いチュートリアルに出会いました。ここでは、作業例です。完全なチュートリアルは、見つけることができます ここで .
ファイルアップロードのダイアログを保持するためのシンプルなフォームです。
<form id="upload" method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="uploadctl" multiple />
<ul id="fileList">
<!-- The file list will be shown here -->
</ul>
</form>
そして、ファイルをアップロードするためのjQueryのコードです。
$('#upload').fileupload({
// This function is called when a file is added to the queue
add: function (e, data) {
//This area will contain file list and progress information.
var tpl = $('<li class="working">'+
'<input type="text" value="0" data-width="48" data-height="48" data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" />'+
'<p></p><span></span></li>' );
// Append the file name and file size
tpl.find('p').text(data.files[0].name)
.append('<i>' + formatFileSize(data.files[0].size) + '</i>');
// Add the HTML to the UL element
data.context = tpl.appendTo(ul);
// Initialize the knob plugin. This part can be ignored, if you are showing progress in some other way.
tpl.find('input').knob();
// Listen for clicks on the cancel icon
tpl.find('span').click(function(){
if(tpl.hasClass('working')){
jqXHR.abort();
}
tpl.fadeOut(function(){
tpl.remove();
});
});
// Automatically upload the file once it is added to the queue
var jqXHR = data.submit();
},
progress: function(e, data){
// Calculate the completion percentage of the upload
var progress = parseInt(data.loaded / data.total * 100, 10);
// Update the hidden input field and trigger a change
// so that the jQuery knob plugin knows to update the dial
data.context.find('input').val(progress).change();
if(progress == 100){
data.context.removeClass('working');
}
}
});
//Helper function for calculation of progress
function formatFileSize(bytes) {
if (typeof bytes !== 'number') {
return '';
}
if (bytes >= 1000000000) {
return (bytes / 1000000000).toFixed(2) + ' GB';
}
if (bytes >= 1000000) {
return (bytes / 1000000).toFixed(2) + ' MB';
}
return (bytes / 1000).toFixed(2) + ' KB';
}
そして、そのデータを処理するためのPHPコードサンプルです。
if($_POST) {
$allowed = array('jpg', 'jpeg');
if(isset($_FILES['uploadctl']) && $_FILES['uploadctl']['error'] == 0){
$extension = pathinfo($_FILES['uploadctl']['name'], PATHINFO_EXTENSION);
if(!in_array(strtolower($extension), $allowed)){
echo '{"status":"error"}';
exit;
}
if(move_uploaded_file($_FILES['uploadctl']['tmp_name'], "/yourpath/." . $extension)){
echo '{"status":"success"}';
exit;
}
echo '{"status":"error"}';
}
exit();
}
上記のコードは、既存のフォームに追加することができます。このプログラムでは、画像が追加されると自動的にアップロードされます。この機能は変更することができ、既存のフォームを送信している間に、画像を送信することができます。
実際のコードで私の答えを更新しました。すべてのクレジットは、コードの原作者にあります。
ソース http://tutorialzine.com/2013/05/mini-ajax-file-upload-form/
関連
-
[解決済み] jQueryを使って要素のIDを取得するにはどうすればよいですか?
-
[解決済み] jQueryのpreventDefault()が発動しない
-
[解決済み] どのラジオボタンが選択されているかをjQueryで知るにはどうしたらよいですか?
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み] jQueryで複数のクラスを持つ要素を選択するにはどうすればよいですか?
-
[解決済み] jQueryで名前を指定して要素を選択するには?
-
[解決済み] jQueryを使用してハイパーリンクのhref属性を変更する方法
-
[解決済み] どうすればjQueryに非同期ではなく、同期のAjaxリクエストを実行させることができますか?
-
[解決済み] jQuery Ajax ファイルアップロード
-
[解決済み] HTTPファイルアップロードの仕組みを教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] jQueryです。簡単なオーバーレイを作成するにはどうすればよいですか?
-
[解決済み] jQuery hasAttrで要素に属性があるかどうかをチェックする【重複あり
-
[解決済み] jQuery に何かを実行する前にすべての画像の読み込みを待つように指示する公式な方法
-
[解決済み] jQueryでチェックボックスの値を取得する
-
[解決済み] jQuery.ajaxでmultipart/formdataを送信する。
-
[解決済み] ドロップダウンのアイテムの選択値をjQueryで取得する
-
[解決済み] jQuery: テキストで要素を検索する
-
[解決済み】HTMLフォームのデフォルトの送信ボタンはどのように決定されるのでしょうか?
-
[解決済み】jQueryのテンプレートエンジン【終了しました
-
[解決済み] jQueryを使用して文字列から最後の文字を削除する方法は?