LoginSignup
4
4

More than 5 years have passed since last update.

画像を縮小してからアップロード

Posted at

画像アップロードフォームを作りたい。
しかし、現在はスマホの画質が良すぎるためアップロードに時間がかかる。
ということで、一旦javascriptで縮小してからアップロードするという方法にする。

jqueryを読み込んである前提で以下をコピペ


<script src="/js/load-image.all.min.js"></script>

<script>
    $(function () {




        $(document).on('change', '#img', function() {


            // 選択中のファイルの一つ目
            var file = this.files[0];
            // ファイルを選択しなかった場合
            if(!file) return;


            // ファイル形式の中にimageが含まれない場合
            if(!/image/.test(file.type)) {
                alert('画像を選択してください。');
                return;
            }

            // 読み込み用の関数で読み込み完了時に、HTMLにcanvas追加
            load(file, function(canvas) {

//                再度アップロードした場合は一旦削除する
                $("#dst canvas").remove();

                dst.appendChild(canvas);
                var base64 = $(canvas).get(0).toDataURL('image/jpeg');
                // base64からBlobデータを作成
                var barr, bin, i, len;
                bin = atob(base64.split('base64,')[1]);
                len = bin.length;
                barr = new Uint8Array(len);
                i = 0;
                while (i < len) {
                    barr[i] = bin.charCodeAt(i);
                    i++;
                }
                blob = new Blob([barr], {type: 'image/jpeg'});

                var name, fd = new FormData();

                fd.append('social_id',"999"); // ファイルを添付する
                fd.append('img', blob); // ファイルを添付する


                $("#upload").hide();




                $.ajax({
                    url: "/hoges/add/", // 送信先
                    type: 'POST',
                    data: fd,
                    processData: false,
                    contentType: false
                })
                    .done(function( data, textStatus, jqXHR ) {
                        alert("送信完了");

                        $("#upload").show();
                        $('#dst').hide();




                    })
                    .fail(function( jqXHR, textStatus, errorThrown ) {
                        // 送信失敗
                        console.log("失敗");
                    });




            });

        });


        function load(file, callback) {


            // canvas: true にすると canvas に画像を描画する(回転させる場合は必須オプション)
            var options = {
                maxHeight: 600,
                maxWidth: 600,
                canvas: true
            };

            loadImage.parseMetaData(file, function (data) {
                if (data.exif) {
                    options.orientation = data.exif.get('Orientation');
                }

                $('#dst').show();

                // 画像の読み込み。完了時に callback が呼び出される
                loadImage(file, callback, options);
            });
        }
    });
</script>
















<div id="upload">

    <div id="dst" style="display: none;"></div>
        <!-- ファイル選択ボタン -->
        <?php echo $this->Form->create($valid, ['type' => 'file']); ?>
        <div id="upload-btn">
            <?php echo $this->Form->input('img', [
                'label' => '画像を選んで確認',
                'type' => 'file',
            ]); ?>
        </div>
        <?php echo $this->Form->input('social_id', [
            'value' => 999,
            'type' => 'hidden'
        ]); ?>
        <?php echo $this->Form->end(); ?>

</div>


送信先の hogescontoroller/add


    public function add()
    {

        pr($this->request->data);//第二引数に cron を入れれば cron用ログに書き出す

        $this->autoRender = false;
    }


結果


/var/www/html/twi.ski/plugins/Okws/src/Controller/DebugsController.php (line 50)
2018-05-24 16:02:27 Debug: Array
(
    [social_id] => 999
    [img] => Array
        (
            [tmp_name] => /tmp/phpMQledW
            [error] => 0
            [name] => blob
            [type] => image/jpeg
            [size] => 33726
        )

)

2018-05-24 16:02:30 Debug: Array
(
    [social_id] => 999
    [img] => Array
        (
            [tmp_name] => /tmp/phpILXG7Q
            [error] => 0
            [name] => blob
            [type] => image/jpeg
            [size] => 58598
        )

)




ちゃんとアップロードできますね!

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4