1. ホーム
  2. jquery

[解決済み] jQuery File Uploadプラグインの実装方法について教えてください。

2022-08-02 01:03:01

質問

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/