LoginSignup
3
5

More than 5 years have passed since last update.

Android標準ブラウザでinput[type="file"]を扱う

Last updated at Posted at 2017-05-18

問題

非表示になっているinput[type="file"]で選択した画像のサムネイルを表示するというものを作成した。
しかし、Android標準ブラウザでいくらボタンを押してもファイルのエクスプローラが立ち上がらない……。
標準ブラウザとか爆発しろ

解決案を探してみると、clickしたときにdisplay: none;を外すというのが書かれていた。
しかし、それだとエクスプローラが立ち上がってからdisplay: none;をつけるということで妙な動きが発生する可能性がある。
またdisplay: none;をつけるタイミングによってはエクスプローラが立ち上がらない事がある。

解決方法1

visibility: hidden; position: absolute; top: -200px; を設定する。
これだと大きさが確保されなくなるので、他のデザインにも影響を与えにくい。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>fileinput</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.0/vue.min.js"></script>
    <script>
    window.onload = () => {
      var vm = new Vue({
        data: function () {
          return {
            fileUrls: []
          }
        },
        methods: {
          submitFileButton: function (e) {
            var input = e.target.parentElement.querySelector('input');
            if (input) {
              input.click();
            }
          },
          showThumbnail: function(e) {
            var self = this;
            self.fileUrls = [];
            var size = e.target.files.length;
            for (var i = 0; i < size; i++) {
              var fileReader = new FileReader();
              fileReader.onload = function (e) {
                self.fileUrls.push(this.result);
              };
              fileReader.readAsDataURL(e.target.files[i]);
            }
          },
          remove: function (fileUrl) {
            var index = this.fileUrls.indexOf(fileUrl);
            this.fileUrls.splice(index, 1);
          }
        },
        el: '#vue'
      });
    }
    </script>
</head>
<body>
<section id="vue">
        <div>
            <button class="btn" @click="submitFileButton">ファイルを選択</button>
<!--
Android標準ブラウザではinput[type="file"]が非表示の場合エクスプローラが立ち上がらない
その為0pxでinput[type="file"]を置いておく
            <input type="file" style="display: none;" @change="showThumbnail" accept="image/png,image/jpeg,image/gif ">
-->
            <input type="file" style="visibility: hidden; position: absolute; top: -200px;" @change="showThumbnail" accept="image/png,image/jpeg,image/gif ">
            <div v-if="fileUrls.length == 0">
                画像をアップロードできるよ
            </div>
            <div v-else>
                <div v-for="fileUrl in fileUrls">
                    <img :src="fileUrl" height="100%" width="100px">
                    <button @click="remove(fileUrl)">×</button>
                </div>
            </div>
        </div>
</section>
</body>
</html>

過去の解決法

width:0; height:0; を設定する。
これだと見えなくなるが、幅などは設定されてしまっているので注意する。

備考

上記を解決しても、Android標準ブラウザでは、サムネイルが表示できる画像とできない画像がある。
ただし、カメラから取った画像は表示できる。
これについては解決できていない……標準ブラウザとか爆発しろ

3
5
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
3
5