質問するログイン新規登録

回答編集履歴

3

変数名を修正

2018/04/08 23:41

投稿

defghi1977
defghi1977

スコア4756

answer CHANGED
@@ -47,8 +47,8 @@
47
47
  <?php
48
48
  //https://stackoverflow.com/questions/6735414/php-data-uri-to-file
49
49
  $encoded = $_REQUEST["encoded"];
50
- $decoded = str_replace(" ", "+", $encoded);
50
+ $replaced = str_replace(" ", "+", $encoded);
51
- $bin = base64_decode($decoded);
51
+ $bin = base64_decode($replaced);
52
52
 
53
53
  $fp = fopen("test.jpg", "wb");
54
54
  fwrite($fp, $bin);

2

一箇所些細なバグ修正

2018/04/08 23:41

投稿

defghi1977
defghi1977

スコア4756

answer CHANGED
@@ -34,7 +34,7 @@
34
34
  e.preventDefault();
35
35
  reader.readAsDataURL(e.dataTransfer.files[0]);
36
36
  };
37
- form.file.onchange = e => {
37
+ file.onchange = e => {
38
38
  reader.readAsDataURL(file.files[0]);
39
39
  };
40
40
  }

1

サンプルコードを提示

2018/04/08 13:15

投稿

defghi1977
defghi1977

スコア4756

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