質問編集履歴

2

追記

2022/09/20 09:39

投稿

rdl
rdl

スコア0

test CHANGED
File without changes
test CHANGED
@@ -9,13 +9,282 @@
9
9
  バリデーションルールの「サイズ制限」を行いますが、なるべくユーザーの方での操作を減らしたいのと、そもそもサーバー容量もへらしたいので、ブラウザ上で画像サイズをリサイズしたいです。
10
10
 
11
11
  1. 画像をアップロード
12
- 2. ブラウザ上で1000×1000px以内のサイズになるようにリサイズ
12
+ 2. ブラウザ上でリサイズ
13
- 3. リサイズされた画像の値で送信(メールに添付されている必要はなし)
13
+ 3. リサイズされた画像で送信(メールに添付されている必要はなし)
14
14
  4. 管理画面内の「問い合わせデータ」でもリサイズされた画像が登録されている
15
15
 
16
-
16
+ ### 試したこと
17
+ 以下のURLを参考に、縮小プレビュー表示はできましたが、この縮小した画像を送信するところで躓いています。
18
+ https://demo.isystk.com/jquery-imageUploader/
19
+
20
+ **MW WP Form フォーム記述**
21
+ ```ここに言語を入力
22
+ <script src="index.js"></script>
23
+ <script src="jquery-imageUploader.js"></script>
24
+ <script type="text/javascript">
25
+ jQuery(function() {
26
+ jQuery('.js-uploadImage').imageUploader({
27
+ dropAreaSelector: '#drop-zone',
28
+ successCallback: function(res) {
29
+ console.log(res);
30
+ }
31
+ });
32
+ });
33
+ </script>
34
+ <div id="drop-zone" style="border: 1px solid; padding: 30px">
35
+ <p>ファイルをドラッグ&ドロップもしくは</p>
36
+ <input
37
+ type="file"
38
+ name="receipt"
39
+ multiple="multiple"
40
+ accept="image/*"
41
+ capture="environment"
42
+ class="js-uploadImage"
43
+ />
44
+ <p class="error-message"></p>
45
+ </div>
46
+
47
+ <div id="select-image">
48
+ <table>
49
+ <tr>
50
+ <th>ファイル名</th>
51
+ <th>元の画像</th>
52
+ <th>リサイズ後画像</th>
53
+ <th>元のサイズ</th>
54
+ <th>リサイズ後サイズ</th>
55
+ <th>タイプ</th>
56
+ </tr>
57
+ </table>
58
+ </div>
59
+ [その他のmw wp formタグ]
60
+ [mwform_backButton value="戻る"][mwform_submit name="submit" value="送信する"]
61
+ ```
62
+
63
+ **出力されたhtml**
64
+ ```ここに言語を入力
65
+ <form method="post" action="" enctype="multipart/form-data">
66
+ <script src="https://tips.dvision.jp/wp-content/themes/test/resize.js"></script>
67
+ <input accept="image/*" name="receipt" type="file" />
68
+ <input type="text" name="他のタグ1" />
69
+ <input type="text" name="他のタグ2" />
70
+ <input type="text" name="他のタグ3" />
71
+ <input type="submit" name="submit" value="送信する" />
72
+ <input type="hidden" id="mw_wp_form_token" name="mw_wp_form_token" value="b8d042c5e3" />
73
+ <input type="hidden" name="_wp_http_referer" value="/118" />
74
+ <input type="hidden" name="mw-wp-form-form-id" value="126" />
75
+ <input type="hidden" name="mw-wp-form-form-verify-token" value="74b785a12369224b18da26f7e41b88aeac7c0295" />
76
+ </form>
77
+ ```
78
+
79
+ **jquery-imageUploader.js**
80
+ ```ここに言語を入力
81
+ (function($) {
82
+ $.fn.imageUploader = function(options) {
83
+
84
+ var params = $.extend({}, $.fn.imageUploader.defaults, options);
85
+
86
+ var nowLoading = false; // 処理中フラグ
87
+ var dropAreaSelector = params.dropAreaSelector;
88
+ var maxFileSize = params.maxFileSize;
89
+ var thumbnail_width = params.thumbnail_width;
90
+ var thumbnail_height = params.thumbnail_height;
91
+ var successCallback = params.successCallback;
92
+ var errorCallback = params.errorCallback;
93
+
94
+ var init = function(target) {
95
+
96
+ // ファイルドロップ時のイベントリスナー
97
+ var dropArea = $(dropAreaSelector);
98
+ dropArea.on('dragenter', function (event) {
99
+ event.preventDefault();
100
+ event.stopPropagation();
101
+ });
102
+ dropArea.on('dragover', function (event) {
103
+ event.preventDefault();
104
+ event.stopPropagation();
105
+ });
106
+ dropArea.on('drop', function (event) {
107
+ event.preventDefault();
108
+ event.stopPropagation();
109
+ var files = event.originalEvent.dataTransfer.files;
110
+ if (files.length === 0) {
111
+ return;
112
+ }
113
+ exec(event.originalEvent.dataTransfer);
114
+ });
115
+
116
+ // ファイル選択時のイベントリスナー
117
+ $(target).change(function(){
118
+ if (this.files.length === 0) {
119
+ return;
120
+ }
121
+ exec(this);
122
+ });
123
+ }
124
+
125
+ var exec = function(obj) {
126
+
127
+ // ファイルAPIに対応していない場合は、エラーメッセージを表示する
128
+ if (!window.File || !window.FileReader || !window.FileList || !window.Blob){
129
+ errorCallback(['お使いのブラウザはファイルAPIに対応していません。']);
130
+ return;
131
+ }
132
+
133
+ if (nowLoading) {
134
+ errorCallback(['処理中です。']);
135
+ return;
136
+ }
137
+
138
+ $.each(obj.files, function(i, file){
139
+
140
+ nowLoading = true;
141
+
142
+ function getExt(filename) {
143
+ var pos = filename.lastIndexOf('.');
144
+ if (pos === -1) return '';
145
+ return filename.slice(pos + 1);
146
+ }
147
+ var ext = getExt(file.name).toLowerCase();
148
+
149
+ if (ext === 'heic') {
17
- mw wp formは送信されるまでは、画像IDがデータベース登録されていないようで
150
+ // HEIC対応 iphone11 以降で撮影され画像にも対応
151
+ // console.log('HEIC形式の画像なのでJPEGに変換します。')
152
+
153
+ heic2any({
154
+ blob: file,
155
+ toType: "image/jpeg",
156
+ quality: 1
157
+ }).then(function(resultBlob) {
158
+ var errors = validate(resultBlob);
159
+ if (0 < errors.length) {
160
+ errorCallback(errors);
161
+ nowLoading = false;
162
+ return;
163
+ }
164
+ resize(resultBlob, function(res) {
165
+ res.fileName = file.name;
166
+ successCallback(res);
167
+ nowLoading = false;
168
+ }, function(errors) {
169
+ errorCallback(errors);
170
+ nowLoading = false;
171
+ return;
172
+ });
173
+ });
174
+ } else {
175
+
176
+ var errors = validate(file);
177
+ if (0 < errors.length) {
178
+ errorCallback(errors);
179
+ nowLoading = false;
180
+ return;
181
+ }
182
+ resize(file, function(res) {
183
+ successCallback(res);
184
+ nowLoading = false;
185
+ }, function(errors) {
186
+ errorCallback(errors);
187
+ nowLoading = false;
188
+ return;
189
+ });
190
+ }
191
+
192
+ });
193
+
194
+ }
195
+
196
+ // 入力チェック
197
+ var validate = function(blob) {
198
+ var errors = [];
199
+ // ファイルサイズチェック
200
+ if( maxFileSize < blob.size ){
201
+ errors.push('画像ファイルのファイルサイズが最大値('+Math.floor(maxFileSize/1000000)+'MB)を超えています。');
202
+ }
203
+ return errors;
204
+ }
205
+
206
+ // そのままの
207
+ var resize = function(blob, callback, errorCallback) {
208
+ var image = new Image();
209
+ var fr=new FileReader();
210
+ fr.onload=function(evt) {
18
- 選択した画像をブラウザ上でリサイズすることは可能でしょうか?
211
+ // リサイズする
212
+ image.onload = function() {
213
+ var width, height;
214
+ if(image.width > image.height){
215
+ // 横長の画像は横のサイズを指定値にあわせる
216
+ var ratio = image.height/image.width;
217
+ width = thumbnail_width;
218
+ height = thumbnail_width * ratio;
219
+ } else {
220
+ // 縦長の画像は縦のサイズを指定値にあわせる
221
+ var ratio = image.width/image.height;
222
+ width = thumbnail_height * ratio;
223
+ height = thumbnail_height;
224
+ }
225
+ // サムネ描画用canvasのサイズを上で算出した値に変更
226
+ var canvas = $('<canvas id="canvas" width="0" height="0" ></canvas>')
227
+ .attr('width', width)
228
+ .attr('height', height);
229
+ var ctx = canvas[0].getContext('2d');
230
+ // canvasに既に描画されている画像をクリア
231
+ ctx.clearRect(0,0,width,height);
232
+ // canvasにサムネイルを描画
19
- phpやJavascript等でサーバー内に保存するというのは見るのですが、mw wp formに組み込めるものなのでしょうか?
233
+ ctx.drawImage(image,0,0,image.width,image.height,0,0,width,height);
234
+
235
+ // canvasからbase64画像データを取得
236
+ var base64 = canvas.get(0).toDataURL('image/jpeg');
237
+ // base64からBlobデータを作成
238
+ var barr, bin, i, len;
239
+ bin = atob(base64.split('base64,')[1]);
240
+ len = bin.length;
241
+ barr = new Uint8Array(len);
242
+ i = 0;
243
+ while (i < len) {
244
+ barr[i] = bin.charCodeAt(i);
245
+ i++;
246
+ }
247
+ var resizeBlob = new Blob([barr], {type: 'image/jpeg'});
248
+ callback({
249
+ fileName: blob.name,
250
+ ofileData: evt.target.result,
251
+ fileData: base64,
252
+ ofileSize: blob.size,
253
+ fileSize: resizeBlob.size,
254
+ fileType: resizeBlob.type
255
+ })
256
+ }
257
+ image.onerror = function() {
258
+ errorCallback(['選択されたファイルをロードできません。']);
259
+ }
260
+ image.src = evt.target.result;
261
+ }
262
+ fr.readAsDataURL(blob);
263
+ }
264
+
265
+ $(this).each(function() {
266
+ init(this);
267
+ });
268
+
269
+ return this;
270
+ }
271
+
272
+ $.fn.imageUploader.defaults = {
273
+ dropAreaSelector: '',
274
+ maxFileSize : 6485760, // 6BM
275
+ thumbnail_width: 500, // 画像リサイズ後の横の長さの最大値
276
+ thumbnail_height: 500, // 画像リサイズ後の縦の長さの最大値
277
+ successCallback : function(res) {console.log(res);},
278
+ errorCallback : function(res) {console.log(res);}
279
+ }
280
+
281
+ })(jQuery);
282
+ ```
283
+ ### 発生している問題・エラーメッセージ
284
+ 画像は、アップロードした原本が登録されてしまいます。
285
+ base64画像データ?(小さくした画像)を送信したいです。
286
+
287
+
20
288
 
21
289
  よろしくお願いいたします。
290
+

1

流れを追加しました

2022/09/17 04:53

投稿

rdl
rdl

スコア0

test CHANGED
File without changes
test CHANGED
@@ -8,6 +8,11 @@
8
8
  アップロードされる写真がスマホで撮影されたものがメインとなると5M以上を想定。
9
9
  バリデーションルールの「サイズ制限」を行いますが、なるべくユーザーの方での操作を減らしたいのと、そもそもサーバー容量もへらしたいので、ブラウザ上で画像サイズをリサイズしたいです。
10
10
 
11
+ 1. 画像をアップロード
12
+ 2. ブラウザ上で1000×1000px以内のサイズになるようにリサイズ
13
+ 3. リサイズされた画像の値で送信(メールに添付されている必要はなし)
14
+ 4. 管理画面内の「問い合わせデータ」でもリサイズされた画像が登録されている
15
+
11
16
 
12
17
  mw wp formは送信されるまでは、画像IDがデータベースに登録されていないようですが
13
18
  選択した画像をブラウザ上でリサイズすることは可能でしょうか?