回答編集履歴

3

変数名を修正

2018/04/08 23:41

投稿

defghi1977
defghi1977

スコア4756

test CHANGED
@@ -96,9 +96,9 @@
96
96
 
97
97
  $encoded = $_REQUEST["encoded"];
98
98
 
99
- $decoded = str_replace(" ", "+", $encoded);
99
+ $replaced = str_replace(" ", "+", $encoded);
100
100
 
101
- $bin = base64_decode($decoded);
101
+ $bin = base64_decode($replaced);
102
102
 
103
103
 
104
104
 

2

一箇所些細なバグ修正

2018/04/08 23:41

投稿

defghi1977
defghi1977

スコア4756

test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  };
72
72
 
73
- form.file.onchange = e => {
73
+ file.onchange = e => {
74
74
 
75
75
  reader.readAsDataURL(file.files[0]);
76
76
 

1

サンプルコードを提示

2018/04/08 13:15

投稿

defghi1977
defghi1977

スコア4756

test CHANGED
@@ -9,3 +9,109 @@
9
9
  ドロップ操作によって得られた`File`オブジェクトを直接フォームデータに追加することは難しいので, `FileReader`オブジェクトを用いて`File`オブジェクトの中身をbase64エンコードされた文字列に変換し, その内容を`input[type="hidden"]`に仕込めば通常のサブミット操作・処理と同様に実装できるでしょう.
10
10
 
11
11
  (この場合サーバー側でのデコードが必要となります)
12
+
13
+
14
+
15
+ ---
16
+
17
+ NOTE:
18
+
19
+ PHP使いの方からのツッコミを覚悟しながらとりあえず動いたものを記述.(出来ることの証明)
20
+
21
+ ※JPEG画像のみを想定しており, 一切のエラー・例外系を考慮していません.
22
+
23
+
24
+
25
+ HTMLサイド
26
+
27
+ - `input[type="file"]`及び`drop`イベントで取得した`File`オブジェクトを`FileReader`オブジェクトでdata uri scheme形式に変換.
28
+
29
+ - その内容を`input[type="hidden"]`に設定(`data:image/jpeg;base64,`の部分は削除)
30
+
31
+ - サブミット処理は`form`要素標準のものを利用する.
32
+
33
+
34
+
35
+ ```HTML
36
+
37
+ <form id="form" action="next.php" method="post">
38
+
39
+ <button type="submit">送信</button>
40
+
41
+ <input id="file" type="file"/>
42
+
43
+ <input name="encoded" type="hidden" value=""/>
44
+
45
+ </form>
46
+
47
+ <script>
48
+
49
+ "use strict";
50
+
51
+ {
52
+
53
+ let selected;
54
+
55
+ const reader = new FileReader();
56
+
57
+ reader.onloadend = e => {
58
+
59
+ form.encoded.value = e.target.result.split(",")[1];
60
+
61
+ }
62
+
63
+ window.ondragover = e => e.preventDefault();
64
+
65
+ window.ondrop = e => {
66
+
67
+ e.preventDefault();
68
+
69
+ reader.readAsDataURL(e.dataTransfer.files[0]);
70
+
71
+ };
72
+
73
+ form.file.onchange = e => {
74
+
75
+ reader.readAsDataURL(file.files[0]);
76
+
77
+ };
78
+
79
+ }
80
+
81
+ </script>
82
+
83
+ ```
84
+
85
+ PHPサイド
86
+
87
+ - hidden項目の内容をバイナリに変換し, ファイルに保存.
88
+
89
+ - とりあえず正しく受信できていることを確認するため, JPEG画像としてバイナリをechoで出力.
90
+
91
+ ```PHP
92
+
93
+ <?php
94
+
95
+ //https://stackoverflow.com/questions/6735414/php-data-uri-to-file
96
+
97
+ $encoded = $_REQUEST["encoded"];
98
+
99
+ $decoded = str_replace(" ", "+", $encoded);
100
+
101
+ $bin = base64_decode($decoded);
102
+
103
+
104
+
105
+ $fp = fopen("test.jpg", "wb");
106
+
107
+ fwrite($fp, $bin);
108
+
109
+ fclose($fp);
110
+
111
+
112
+
113
+ header("Content-Type: image/jpeg");
114
+
115
+ echo $bin;
116
+
117
+ ```