LoginSignup
1
1

More than 5 years have passed since last update.

画像ファイルのレビュー & Ajax送信

Last updated at Posted at 2015-08-31

SenchaTouchの既存フォーム送信機能がうまくいかないため、別の方法で対応した。

専用コンポーネント実装

// 写真用コンポーネント
Ext.define('MomBaby.view.common.CapturePicture', {
    extend: 'Ext.Component',
    xtype: 'capturepicture',

    config: {
        captured: false,
        cls: 'picture-capture-area',
        html: [
            '<div class="picture-capture">',
                '<div class="icon"><i class="icon-camera"></i> 写真選択</div>',
                '<img class="image-tns" />',
                '<input type="file" accept="image/*;capture=camera" />', //Step 1
            '</div>',
        ].join('')
    },

    initialize: function() {
        this.callParent(arguments);

        this.file = this.element.down('input[type=file]');
        this.img = this.element.down('img');
        this.inputImg = new Image();
        this.isChange = false;

        this.file.on('change', this.setPicture, this); //Step 2

        //FIX for webkit
        this.createObjectURL = (window.webkitURL && window.webkitURL.createObjectURL) ? function(file) {
            return window.webkitURL.createObjectURL(file);
        } : (window.URL && window.URL.createObjectURL) ? function(file) {
            return window.URL.createObjectURL(file);
        } : undefined;
    },

    setPicture: function(event) {
        this.isChange = true;
        var files = event.target.files;
        if (files.length === 1) {
            var file = files[0];
            if ( file.size == 0 ){
                // アラート
                Ext.Msg.alert('アラート', '選択したファイルがアップロードできません。');
                return;
            }

            // 画像表示
            var src = this.createObjectURL(file);
            this.img.setStyle('display', 'block');
            this.img.set({
                src: src //Step 4
            });
            this.inputImg.src = src;
            this.setCaptured(true);
        }
    },

    setPictureWithUrl: function(url){
        this.img.setStyle('display', 'block');
        this.img.set({
            src: url
        });
        this.inputImg.src = url;
        this.setCaptured(true);
    },

    reset: function() {
        this.img.setStyle('display', 'none');
        this.img.set({
            src: ''
        });
        this.inputImg.src = '';
        this.isChange = false;
        this.setCaptured(false);
    },

    getImageDataUrl: function() { //Step 6
        var imgCanvas = document.createElement("canvas"),
            imgContext = imgCanvas.getContext("2d");

        if (this.getCaptured()) {
            var num = this.inputImg.width / 320;
            this.inputImg.width = 320;
            this.inputImg.height = this.inputImg.height / num;

            // Make sure canvas is as big as the picture
            imgCanvas.width = this.inputImg.width;
            imgCanvas.height = this.inputImg.height;

            // Draw image into canvas element
            imgContext.drawImage(this.inputImg, 0, 0, this.inputImg.width, this.inputImg.height);

            // Return the image as a data URL
            var url = imgCanvas.toDataURL("image/png");
            imgCanvas = null;
            imgContext = null;
            return url;
        }
    }
});

スタイル

/* 写真選択 */
.picture-capture-area {
    background: #fff;
    padding: 20px 0;
    border-bottom: 1px solid #f0f0f0;
}
.picture-capture {
    background-image: -webkit-linear-gradient(top, #d11966 0%, #a2134f 3%, #750d38 100%);
    border-radius: 5px;
    border:1px solid #750d38;
    border-width:1px;
    overflow: hidden;
    margin: 0px auto;
    width: 100px;
    height: 100px;
    position: relative;
}
.picture-capture input {
    border: 0;
    position: absolute;
    cursor: pointer;
    top: -2px;
    right: -2px;
    filter: alpha(opacity=0);
    opacity: 0;
    font-size: 1000px;
}
.picture-capture img {
    position: absolute;
    border-radius: 5px;
    width: 100%;
    height: 100%;
    display:none;
    background: #fff;
}
.picture-capture .icon {
    position: absolute;
    width: 100%;
    height: 100%;
    color:#fff;
    text-align: center;
    font-size: 16px;
}
.picture-capture .icon i { display:block; font-size: 50px; color:#fff; height: 61px; }
.picture-capture .icon-camera {}
.picture-capture .icon-camera:before {
    font-style: normal;
    text-align: center;
    font-family: 'Pictos';
    content: "v";
}

データをAjaxで送信する

下記のコードで画像データを取得し、送信する

// formコンポーネントから取得する
var capture = form.down('capturepicture');
var data = capture.getImageDataUrl();

// Ajax送信
Ext.Ajax.request({
    url: 'xxx',
    method: 'POST',
    params: { image: data },
    success: function(response, opts){
    },
    failure: function(response, opts) {
    },
    scope: this
});

実装済みアプリ

1
1
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
1
1