質問編集履歴

14

追記5追加

2021/05/31 22:58

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -649,3 +649,25 @@
649
649
 
650
650
 
651
651
  ![イメージ説明](92e33ad4950cdf9476d07ec2cdc033c6.png)
652
+
653
+
654
+
655
+ #追記5
656
+
657
+
658
+
659
+ ![イメージ説明](24dd568c56966550983b7e534bdacfca.png)
660
+
661
+ プロフィール画像選択前
662
+
663
+
664
+
665
+ ![イメージ説が9563d0fae34ce1c21bb078978b152.png)
666
+
667
+ プロフィール画像選択後
668
+
669
+
670
+
671
+ ![イメージ説明](8cc9d6fc81790670731827e876553b3f.png)
672
+
673
+ 「更新ボタン」押下後直後(アラート表示時)

13

追記4追加

2021/05/31 22:58

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -645,3 +645,7 @@
645
645
 
646
646
 
647
647
  #追記4
648
+
649
+
650
+
651
+ ![イメージ説明](92e33ad4950cdf9476d07ec2cdc033c6.png)

12

追記4追加

2021/05/30 20:50

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -641,3 +641,7 @@
641
641
 
642
642
 
643
643
  ![イメージ説明](13da27559ac777edd8651fae3dd9a8f2.png)
644
+
645
+
646
+
647
+ #追記4

11

追記3追加

2021/05/29 21:56

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -633,3 +633,11 @@
633
633
  ![イメージ説明](361fc0ba4eb2a727fef9514ffb8fe67d.png)![イメージ説明](27eef8aaf09b4cd9bf640fa088b198f3.png)
634
634
 
635
635
  ![イメージ説明](452c823b2f2a5ea263bce459c71c2f27.png)
636
+
637
+
638
+
639
+ #追加3
640
+
641
+
642
+
643
+ ![イメージ説明](13da27559ac777edd8651fae3dd9a8f2.png)

10

実際のコードにmypageのコード追加

2021/05/29 21:17

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -56,7 +56,105 @@
56
56
 
57
57
  ```ここに言語を入力
58
58
 
59
+ <template>
60
+
61
+ <div>
62
+
63
+ <Header />
64
+
65
+ <div class="mypage flex">
66
+
67
+ <div class="mypage-inner flex">
68
+
69
+ <div class="profile-inner-l flex">
70
+
71
+ <img
72
+
73
+ class="profile-inner-l-img"
74
+
75
+ :src="uploadedImage == '' ? preview : uploadedImage.fileUrl"
76
+
77
+ alt="プロフィール画像"
78
+
79
+ />
80
+
81
+ <div class="profile-inner-l-name txt">{{ profileData.name }}</div>
82
+
83
+ </div>
84
+
85
+ <div class="profile-inner-r flex">
86
+
87
+ <div class="item-inner">
88
+
89
+ <div class="post">
90
+
91
+ <div class="txt">{{ listData.length }}</div>
92
+
93
+ <p>POSTS</p>
94
+
95
+ </div>
96
+
97
+ <div class="bookmark">
98
+
99
+ <div class="txt">{{ bookmarkList.length }}</div>
100
+
101
+ <p>BOOKMARK</p>
102
+
103
+ </div>
104
+
105
+ </div>
106
+
107
+ <hr class="separate" />
108
+
109
+ <button
110
+
111
+ @click="
112
+
113
+ show();
114
+
115
+ openModal();
116
+
117
+ "
118
+
119
+ class="profile-edit flex"
120
+
121
+ >
122
+
123
+ プロフィール編集
124
+
125
+ </button>
126
+
127
+ <modal
128
+
129
+ class="modal-inner"
130
+
131
+ v-scroll-lock="open"
132
+
133
+ name="edit"
134
+
135
+ :width="1100"
136
+
137
+ :height="740"
138
+
139
+ >
140
+
141
+ <div data-modal="edit" aria-expanded="true" class="vm--overlay">
142
+
143
+ <div class="vm--top-right-slot"></div>
144
+
145
+ </div>
146
+
147
+ <div class="modal-header flex">
148
+
149
+ <h2 class="profile-tll flex">プロフィールを編集する</h2>
150
+
151
+ <hr class="separate" />
152
+
153
+ </div>
154
+
155
+ <div class="modal-body">
156
+
59
-        <div class="profile-inner flex">
157
+ <div class="profile-inner flex">
60
158
 
61
159
  <div class="profile-contens flex">
62
160
 
@@ -64,7 +162,11 @@
64
162
 
65
163
  <img
66
164
 
165
+ :src="
166
+
67
- :src="uploadedImage == '' ? preview : uploadedImage.fileUrl"
167
+ uploadedImage == '' ? preview : uploadedImage.fileUrl
168
+
169
+ "
68
170
 
69
171
  width="200"
70
172
 
@@ -114,47 +216,13 @@
114
216
 
115
217
  </div>
116
218
 
117
- <div class="profile-contens flex">
219
+
118
-
119
- <select
220
+
120
-
121
- class="profile-select"
221
+
122
-
123
- v-model="sex"
222
+
124
-
125
- :style="{ color: sex == '' ? 'gray' : 'white' }"
126
-
127
- >
128
-
129
- <option class="profile-item" value hidden>性別</option>
130
-
131
- <option
132
-
133
- v-for="sex in sexs"
134
-
135
- :value="sex.name"
136
-
137
- :key="sex.id"
138
-
139
- class="profile-item"
140
-
141
- style="color: white;"
142
-
143
- >{{ sex.name }}</option
144
-
145
- >
146
-
147
- </select>
148
-
149
- </div>
150
-
151
-
152
-
153
-          ~ 省略 ~
223
+  ~ 省略~
154
-
155
-
156
-
157
- </div>
224
+
225
+
158
226
 
159
227
  <button
160
228
 
@@ -176,19 +244,7 @@
176
244
 
177
245
  </div>
178
246
 
179
- <button
180
-
181
- @click="
182
-
183
- updateBtn();
184
-
185
- uploadImage();
186
-
187
- "
188
-
189
- class="update-btn flex"
247
+ <button @click="updateBtn" class="update-btn flex">
190
-
191
- >
192
248
 
193
249
  更新
194
250
 
@@ -196,296 +252,378 @@
196
252
 
197
253
  </div>
198
254
 
255
+ </div>
256
+
257
+ </modal>
258
+
259
+ </div>
260
+
261
+ </div>
262
+
263
+ <div class="profile-list">
264
+
265
+ <ul class="list-item">
266
+
267
+ <li class="list-items">
268
+
269
+ 性別:
270
+
271
+ <div class="list-color">{{ profileData.sex }}</div>
272
+
273
+ </li>
274
+
275
+
276
+
277
+  ~ 省略~
278
+
279
+
280
+
281
+ </template>
282
+
283
+
284
+
285
+ <script>
286
+
287
+ import firebase from "firebase";
288
+
289
+
290
+
291
+  ~ 省略~
292
+
293
+
294
+
295
+
296
+
297
+ export default {
298
+
299
+ data() {
300
+
301
+ return {
302
+
303
+ name: "",
304
+
305
+ sex: "",
306
+
307
+ sexs: [{ name: "男性" }, { name: "女性" }, { name: "その他" }],
308
+
309
+
310
+
311
+  ~ 省略~
312
+
313
+
314
+
315
+ ],
316
+
317
+ favMovie: "",
318
+
319
+ uploadedImage: "",
320
+
321
+ profileData: {},
322
+
323
+ //配列にしないようにする。
324
+
325
+ listData: [],
326
+
327
+ paginate: ["paginate-listData", "paginate-bookmarkList"],
328
+
329
+ bookmarkList: [],
330
+
331
+ open: false,
332
+
333
+ file: "",
334
+
335
+ preview: require("../assets/デフォルトの画像.jpg"),
336
+
337
+ };
338
+
339
+ },
340
+
341
+ components: {
342
+
343
+ Header,
344
+
345
+ List,
346
+
347
+ },
348
+
349
+ methods: {
350
+
351
+ onFileChange(e) {
352
+
353
+ const image = e.target.files; //選択された画像ファイルを選択
354
+
355
+ this.file = image[0]; //画像ファイルを1つだけ選択
356
+
357
+
358
+
359
+ // Firebase storageに保存するパス乱数で決めてthis.uploadUrlへ代入
360
+
361
+ const S =
362
+
363
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
364
+
365
+ const N = 16;
366
+
367
+ this.uploadUrl = Array.from(crypto.getRandomValues(new Uint32Array(N)))
368
+
369
+ .map((n) => S[n % S.length])
370
+
371
+ .join("");
372
+
373
+
374
+
375
+ let self = this;
376
+
377
+ let fileReader = new FileReader();
378
+
379
+ //FileReaderは、Fileオブジェクトからデータを読み込むことのみを目的としたオブジェクト
380
+
381
+ fileReader.onload = function() {
382
+
383
+ //fileReader.onloadは、読み込みが正常に完了した時に発火するイベント
384
+
385
+ self.preview = fileReader.result;
386
+
387
+ //fileReaderの結果をself.previewへ代入
388
+
389
+ //関数の中ではfileReaderの[this]を参照してしまうため、一旦[self]に代入して、[this.]の代わりに[self.] とする
390
+
391
+ };
392
+
393
+ fileReader.readAsDataURL(this.file);
394
+
395
+ //this.fileの値をデータURLとして読み込み、488行目が発火する。
396
+
397
+ },
398
+
399
+ // updateBtn()が押下されたら、dbインスタンスを初期化して"posts"という名前のコレクションへの参照
400
+
401
+ updateBtn() {
402
+
403
+ this.$swal({
404
+
405
+ title: "内容確認",
406
+
407
+ text: "この内容で更新しますか?",
408
+
409
+ icon: "info",
410
+
411
+ buttons: true,
412
+
413
+ dangerMode: true,
414
+
415
+ })
416
+
417
+ .then((willDelete) => {
418
+
419
+ if (willDelete) {
420
+
421
+ let uploadParam = {};
422
+
423
+ if (this.uploadUrl) {
424
+
425
+ const uploadTask = firebase
426
+
427
+ .storage()
428
+
429
+ .ref(this.uploadUrl) //さっき決めたパスを参照して、
430
+
431
+ // .child(this.uploadUrl)
432
+
433
+ .put(this.file); //保存する
434
+
435
+ uploadTask.then(() => {
436
+
437
+ uploadTask.snapshot.ref.getDownloadURL().then((fileUrl) => {
438
+
439
+ //this.fileに保存されたrefを参照してファイルのダウンロード URL を取得して、fileUrlへ代入。
440
+
441
+ const uploadedImage = {
442
+
443
+ fileUrl: fileUrl,
444
+
445
+ time: firebase.firestore.FieldValue.serverTimestamp(),
446
+
447
+ };
448
+
449
+ console.log(fileUrl, this.uploadUrl)
450
+
451
+ uploadParam = { uploadedImage: uploadedImage };
452
+
453
+ //uploadParamへuploadedImageを代入。
454
+
455
+ const currentUser=firebase.auth().currentUser;
456
+
457
+ currentUser.updateProfile({
458
+
459
+ photoURL : fileUrl
460
+
461
+ })
462
+
463
+ .then(()=>{
464
+
465
+ })
466
+
467
+
468
+
469
+ });
470
+
471
+ });
472
+
473
+ }
474
+
475
+ firebase
476
+
477
+ //画像をfirestoreに保存
478
+
479
+ .firestore()
480
+
481
+ .collection("users") //保存する場所を参照して、
482
+
483
+ .doc(this.$route.params.uid) //追加で保存setメソッドを使うと上書きされる
484
+
485
+ .set(
486
+
487
+ {
488
+
489
+ name: this.name,
490
+
491
+ sex: this.sex,
492
+
493
+ age: this.age,
494
+
495
+ access: this.access,
496
+
497
+ selfpr: this.selfpr,
498
+
499
+ profession: this.profession,
500
+
501
+ genre: this.genre,
502
+
503
+ favMovie: this.favMovie,
504
+
505
+ ...uploadParam,
506
+
507
+ time: firebase.firestore.FieldValue.serverTimestamp(),
508
+
509
+ //サーバ側で値設定
510
+
511
+ },
512
+
513
+ { merge: true }
514
+
515
+ //set()でmergeをtrueにすると、上書き。updetaと同様。
516
+
517
+ );
518
+
519
+ this.$swal("更新しました。", {
520
+
521
+ icon: "success",
522
+
523
+ });
524
+
525
+ // this.$router.go({
526
+
527
+ // path: `/mypage/${this.$route.params.uid}`,
528
+
529
+ // force: true,
530
+
531
+ // });
532
+
533
+ //プロフィール編集されたらページをリロード
534
+
535
+ } else {
536
+
537
+ this.$swal("キャンセルしました。");
538
+
539
+ }
540
+
541
+ })
542
+
543
+ // .catch(() => {
544
+
545
+ // this.$swal("更新出来ませんでした。", {
546
+
547
+ // icon: "error",
548
+
549
+ // });
550
+
551
+ // });
552
+
553
+ },
554
+
555
+
556
+
557
+  ~ 省略~
558
+
559
+
560
+
561
+ },
562
+
563
+ created() {
564
+
565
+ const currentUser = firebase.auth().currentUser;
566
+
567
+ this.uid = currentUser.uid;
568
+
569
+
570
+
571
+ if (currentUser) {
572
+
573
+ firebase
574
+
575
+ .firestore()
576
+
577
+ .collection("users")
578
+
579
+ .doc(this.$route.params.uid)
580
+
581
+ .get()
582
+
583
+ .then((snapshot) => {
584
+
585
+ this.profileData = snapshot.data();
586
+
587
+ this.name = this.profileData.name || "";
588
+
589
+ this.sex = this.profileData.sex || "";
590
+
591
+ this.age = this.profileData.age || "";
592
+
593
+ this.access = this.profileData.access || "";
594
+
595
+ this.selfpr = this.profileData.selfpr || "";
596
+
597
+ this.profession = this.profileData.profession || "";
598
+
599
+ this.uploadedImage = this.profileData.uploadedImage || "";
600
+
601
+ this.genre = this.profileData.genre || "";
602
+
603
+ this.favMovie = this.profileData.favMovie || "";
604
+
605
+ //全てのデータを取得して、profileDataへ代入。
606
+
607
+ });
608
+
609
+ }
610
+
611
+
612
+
613
+  ~ 省略~
614
+
615
+
616
+
617
+ };
618
+
619
+ </script>
620
+
621
+
622
+
199
623
  ```
200
624
 
201
625
 
202
626
 
203
- ```ここに言語を入力
204
-
205
- export default {
206
-
207
- data() {
208
-
209
- return {
210
-
211
- name: "",
212
-
213
- sex: "",
214
-
215
- sexs: [{ name: "男性" }, { name: "女性" }, { name: "その他" }],
216
-
217
-
218
-
219
-   ~ 省略 ~
220
-
221
-
222
-
223
- file: "",
224
-
225
- preview: require("../assets/デフォルトの画像.jpg"),
226
-
227
- };
228
-
229
- },
230
-
231
- components: {
232
-
233
- Header,
234
-
235
- List,
236
-
237
- },
238
-
239
- methods: {
240
-
241
- onFileChange(e) {
242
-
243
- const image = e.target.files; //選択された画像ファイルを選択
244
-
245
- this.file = image[0]; //画像ファイルを1つだけ選択
246
-
247
-
248
-
249
- // Firebase storageに保存するパス乱数で決めてthis.uploadUrlへ代入
250
-
251
- const S =
252
-
253
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
254
-
255
- const N = 16;
256
-
257
- this.uploadUrl = Array.from(crypto.getRandomValues(new Uint32Array(N)))
258
-
259
- .map((n) => S[n % S.length])
260
-
261
- .join("");
262
-
263
-
264
-
265
- let self = this;
266
-
267
- let fileReader = new FileReader();
268
-
269
- //FileReaderは、Fileオブジェクトからデータを読み込むことのみを目的としたオブジェクト
270
-
271
- fileReader.onload = function() {
272
-
273
- //fileReader.onloadは、読み込みが正常に完了した時に発火するイベント
274
-
275
- self.preview = fileReader.result;
276
-
277
- //fileReaderの結果をself.previewへ代入
278
-
279
- //関数の中ではfileReaderの[this]を参照してしまうため、一旦[self]に代入して、[this.]の代わりに[self.] とする
280
-
281
- };
282
-
283
- fileReader.readAsDataURL(this.file);
284
-
285
- //this.fileの値をデータURLとして読み込み、488行目が発火する。
286
-
287
- },
288
-
289
- // updateBtn()が押下されたら、dbインスタンスを初期化して"posts"という名前のコレクションへの参照
290
-
291
- updateBtn() {
292
-
293
- this.$swal({
294
-
295
- title: "内容確認",
296
-
297
- text: "この内容で更新しますか?",
298
-
299
- icon: "info",
300
-
301
- buttons: true,
302
-
303
- dangerMode: true,
304
-
305
- })
306
-
307
- .then((willDelete) => {
308
-
309
- if (willDelete) {
310
-
311
- let uploadParam = {};
312
-
313
- if (this.uploadUrl) {
314
-
315
- const uploadTask = firebase
316
-
317
- .storage()
318
-
319
- .ref(this.uploadUrl) //さっき決めたパスを参照して、
320
-
321
- // .child(this.uploadUrl)
322
-
323
- .put(this.file); //保存する
324
-
325
- uploadTask.then(() => {
326
-
327
- uploadTask.snapshot.ref.getDownloadURL().then((fileUrl) => {
328
-
329
- //this.fileに保存されたrefを参照してファイルのダウンロード URL を取得して、fileUrlへ代入。
330
-
331
- const uploadedImage = {
332
-
333
- fileUrl: fileUrl,
334
-
335
- time: firebase.firestore.FieldValue.serverTimestamp(),
336
-
337
- };
338
-
339
- uploadParam = { uploadedImage: uploadedImage };
340
-
341
- //uploadParamへuploadedImageを代入。
342
-
343
- const currentUser=firebase.auth().currentUser;
344
-
345
- currentUser.updateProfile({
346
-
347
- photoURL : fileUrl
348
-
349
- })
350
-
351
- .then(()=>{
352
-
353
- })
354
-
355
- .catch((err)=>{
356
-
357
- console.log(err);
358
-
359
- });
360
-
361
- });
362
-
363
- });
364
-
365
- }
366
-
367
- firebase
368
-
369
- //画像をfirestoreに保存
370
-
371
- .firestore()
372
-
373
- .collection("users") //保存する場所を参照して、
374
-
375
- .doc(this.$route.params.uid) //追加で保存setメソッドを使うと上書きされる
376
-
377
- .set(
378
-
379
- {
380
-
381
- name: this.name,
382
-
383
- sex: this.sex,
384
-
385
- age: this.age,
386
-
387
- access: this.access,
388
-
389
- selfpr: this.selfpr,
390
-
391
- profession: this.profession,
392
-
393
- genre: this.genre,
394
-
395
- favMovie: this.favMovie,
396
-
397
- ...uploadParam,
398
-
399
- time: firebase.firestore.FieldValue.serverTimestamp(),
400
-
401
- //サーバ側で値設定
402
-
403
- },
404
-
405
- { merge: true }
406
-
407
- //set()でmergeをtrueにすると、上書き。updetaと同様。
408
-
409
- );
410
-
411
- this.$swal("更新しました。", {
412
-
413
- icon: "success",
414
-
415
- });
416
-
417
- // this.$router.go({
418
-
419
- // path: `/mypage/${this.$route.params.uid}`,
420
-
421
- // force: true,
422
-
423
- // });
424
-
425
- //プロフィール編集されたらページをリロード
426
-
427
- } else {
428
-
429
- this.$swal("キャンセルしました。");
430
-
431
- }
432
-
433
- })
434
-
435
- // .catch(() => {
436
-
437
- // this.$swal("更新出来ませんでした。", {
438
-
439
- // icon: "error",
440
-
441
- // });
442
-
443
- // });
444
-
445
- },
446
-
447
- show() {
448
-
449
- this.$modal.show("edit");
450
-
451
- },
452
-
453
- hide() {
454
-
455
- this.$modal.hide("edit");
456
-
457
- },
458
-
459
- openModal() {
460
-
461
- this.open = true;
462
-
463
- },
464
-
465
- closeModal() {
466
-
467
- this.open = false;
468
-
469
- },
470
-
471
- },
472
-
473
- ```
474
-
475
-
476
-
477
- #追記1
478
-
479
-
480
-
481
- 長期間回答が得られなかった為、以下サイトにも掲載させて頂いております。
482
-
483
-
484
-
485
- [【Vue x Storage】プロフィール画像を選択後、選択した画像を表示させたいです。](https://qiita.com/TMTN/questions/5446a1dec75c3682dcbb)
486
-
487
- [【Vue x Storage】プロフィール画像を選択後、選択した画像を表示させたい](https://ja.stackoverflow.com/questions/76127/vue-x-storage-%e3%83%97%e3%83%ad%e3%83%95%e3%82%a3%e3%83%bc%e3%83%ab%e7%94%bb%e5%83%8f%e3%82%92%e9%81%b8%e6%8a%9e%e5%be%8c-%e9%81%b8%e6%8a%9e%e3%81%97%e3%81%9f%e7%94%bb%e5%83%8f%e3%82%92%e8%a1%a8%e7%a4%ba%e3%81%95%e3%81%9b%e3%81%9f%e3%81%84)
488
-
489
627
 
490
628
 
491
629
  #追記2

9

画像追加

2021/05/29 19:59

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -492,4 +492,6 @@
492
492
 
493
493
 
494
494
 
495
+ ![イメージ説明](361fc0ba4eb2a727fef9514ffb8fe67d.png)![イメージ説明](27eef8aaf09b4cd9bf640fa088b198f3.png)
496
+
495
- ![イメージ説明](361fc0ba4eb2a727fef9514ffb8fe67d.png)
497
+ ![イメージ説明](452c823b2f2a5ea263bce459c71c2f27.png)

8

追記2追加

2021/05/29 17:09

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -485,3 +485,11 @@
485
485
  [【Vue x Storage】プロフィール画像を選択後、選択した画像を表示させたいです。](https://qiita.com/TMTN/questions/5446a1dec75c3682dcbb)
486
486
 
487
487
  [【Vue x Storage】プロフィール画像を選択後、選択した画像を表示させたい](https://ja.stackoverflow.com/questions/76127/vue-x-storage-%e3%83%97%e3%83%ad%e3%83%95%e3%82%a3%e3%83%bc%e3%83%ab%e7%94%bb%e5%83%8f%e3%82%92%e9%81%b8%e6%8a%9e%e5%be%8c-%e9%81%b8%e6%8a%9e%e3%81%97%e3%81%9f%e7%94%bb%e5%83%8f%e3%82%92%e8%a1%a8%e7%a4%ba%e3%81%95%e3%81%9b%e3%81%9f%e3%81%84)
488
+
489
+
490
+
491
+ #追記2
492
+
493
+
494
+
495
+ ![イメージ説明](361fc0ba4eb2a727fef9514ffb8fe67d.png)

7

内容修正

2021/05/29 17:04

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -236,61 +236,65 @@
236
236
 
237
237
  },
238
238
 
239
- methods: {
239
+ methods: {
240
+
241
+ onFileChange(e) {
242
+
243
+ const image = e.target.files; //選択された画像ファイルを選択
244
+
245
+ this.file = image[0]; //画像ファイルを1つだけ選択
246
+
247
+
248
+
249
+ // Firebase storageに保存するパス乱数で決めてthis.uploadUrlへ代入
250
+
251
+ const S =
252
+
253
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
254
+
255
+ const N = 16;
256
+
257
+ this.uploadUrl = Array.from(crypto.getRandomValues(new Uint32Array(N)))
258
+
259
+ .map((n) => S[n % S.length])
260
+
261
+ .join("");
262
+
263
+
264
+
265
+ let self = this;
266
+
267
+ let fileReader = new FileReader();
268
+
269
+ //FileReaderは、Fileオブジェクトからデータを読み込むことのみを目的としたオブジェクト
270
+
271
+ fileReader.onload = function() {
272
+
273
+ //fileReader.onloadは、読み込みが正常に完了した時に発火するイベント
274
+
275
+ self.preview = fileReader.result;
276
+
277
+ //fileReaderの結果をself.previewへ代入
278
+
279
+ //関数の中ではfileReaderの[this]を参照してしまうため、一旦[self]に代入して、[this.]の代わりに[self.] とする
280
+
281
+ };
282
+
283
+ fileReader.readAsDataURL(this.file);
284
+
285
+ //this.fileの値をデータURLとして読み込み、488行目が発火する。
286
+
287
+ },
240
288
 
241
289
  // updateBtn()が押下されたら、dbインスタンスを初期化して"posts"という名前のコレクションへの参照
242
290
 
243
291
  updateBtn() {
244
292
 
245
- firebase
246
-
247
- .firestore()
248
-
249
- .collection("users")
250
-
251
- .doc(this.$route.params.uid)
252
-
253
- //現在のURLのパラメーターを取得。
254
-
255
- .set(
256
-
257
- {
258
-
259
- name: this.name,
260
-
261
- sex: this.sex,
262
-
263
- age: this.age,
264
-
265
- access: this.access,
266
-
267
- selfpr: this.selfpr,
268
-
269
- profession: this.profession,
270
-
271
- genre: this.genre,
272
-
273
- favMovie: this.favMovie,
274
-
275
- time: firebase.firestore.FieldValue.serverTimestamp(),
276
-
277
- //サーバ側で値設定
278
-
279
- },
280
-
281
- { merge: true }
282
-
283
- //set()でmergeをtrueにすると、上書き。updetaと同様。
284
-
285
- );
286
-
287
-
288
-
289
293
  this.$swal({
290
294
 
291
295
  title: "内容確認",
292
296
 
293
- text: "この内容で投稿しますか?",
297
+ text: "この内容で更新しますか?",
294
298
 
295
299
  icon: "info",
296
300
 
@@ -298,33 +302,145 @@
298
302
 
299
303
  dangerMode: true,
300
304
 
301
- }).then((willDelete) => {
302
-
303
- if (willDelete) {
304
-
305
- this.$swal("投稿しました。", {
306
-
307
- icon: "success",
308
-
309
- });
310
-
311
- this.$router.go({
312
-
313
- path: `/mypage/${this.$route.params.uid}`,
314
-
315
- force: true,
316
-
317
- });
318
-
319
- //プロフィール編集されたらページをリロード
320
-
321
- } else {
322
-
323
- this.$swal("キャンセルしました。");
324
-
325
- }
326
-
327
- });
305
+ })
306
+
307
+ .then((willDelete) => {
308
+
309
+ if (willDelete) {
310
+
311
+ let uploadParam = {};
312
+
313
+ if (this.uploadUrl) {
314
+
315
+ const uploadTask = firebase
316
+
317
+ .storage()
318
+
319
+ .ref(this.uploadUrl) //さっき決めたパスを参照して、
320
+
321
+ // .child(this.uploadUrl)
322
+
323
+ .put(this.file); //保存する
324
+
325
+ uploadTask.then(() => {
326
+
327
+ uploadTask.snapshot.ref.getDownloadURL().then((fileUrl) => {
328
+
329
+ //this.fileに保存されたrefを参照してファイルのダウンロード URL を取得して、fileUrlへ代入。
330
+
331
+ const uploadedImage = {
332
+
333
+ fileUrl: fileUrl,
334
+
335
+ time: firebase.firestore.FieldValue.serverTimestamp(),
336
+
337
+ };
338
+
339
+ uploadParam = { uploadedImage: uploadedImage };
340
+
341
+ //uploadParamへuploadedImageを代入。
342
+
343
+ const currentUser=firebase.auth().currentUser;
344
+
345
+ currentUser.updateProfile({
346
+
347
+ photoURL : fileUrl
348
+
349
+ })
350
+
351
+ .then(()=>{
352
+
353
+ })
354
+
355
+ .catch((err)=>{
356
+
357
+ console.log(err);
358
+
359
+ });
360
+
361
+ });
362
+
363
+ });
364
+
365
+ }
366
+
367
+ firebase
368
+
369
+ //画像をfirestoreに保存
370
+
371
+ .firestore()
372
+
373
+ .collection("users") //保存する場所を参照して、
374
+
375
+ .doc(this.$route.params.uid) //追加で保存setメソッドを使うと上書きされる
376
+
377
+ .set(
378
+
379
+ {
380
+
381
+ name: this.name,
382
+
383
+ sex: this.sex,
384
+
385
+ age: this.age,
386
+
387
+ access: this.access,
388
+
389
+ selfpr: this.selfpr,
390
+
391
+ profession: this.profession,
392
+
393
+ genre: this.genre,
394
+
395
+ favMovie: this.favMovie,
396
+
397
+ ...uploadParam,
398
+
399
+ time: firebase.firestore.FieldValue.serverTimestamp(),
400
+
401
+ //サーバ側で値設定
402
+
403
+ },
404
+
405
+ { merge: true }
406
+
407
+ //set()でmergeをtrueにすると、上書き。updetaと同様。
408
+
409
+ );
410
+
411
+ this.$swal("更新しました。", {
412
+
413
+ icon: "success",
414
+
415
+ });
416
+
417
+ // this.$router.go({
418
+
419
+ // path: `/mypage/${this.$route.params.uid}`,
420
+
421
+ // force: true,
422
+
423
+ // });
424
+
425
+ //プロフィール編集されたらページをリロード
426
+
427
+ } else {
428
+
429
+ this.$swal("キャンセルしました。");
430
+
431
+ }
432
+
433
+ })
434
+
435
+ // .catch(() => {
436
+
437
+ // this.$swal("更新出来ませんでした。", {
438
+
439
+ // icon: "error",
440
+
441
+ // });
442
+
443
+ // });
328
444
 
329
445
  },
330
446
 
@@ -352,114 +468,6 @@
352
468
 
353
469
  },
354
470
 
355
- onFileChange(e) {
356
-
357
- const image = e.target.files; //選択された画像ファイルを選択
358
-
359
- this.file = image[0]; //画像ファイルを1つだけ選択
360
-
361
-
362
-
363
- const S =
364
-
365
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
366
-
367
- const N = 16;
368
-
369
- this.uploadUrl = Array.from(crypto.getRandomValues(new Uint32Array(N)))
370
-
371
- .map((n) => S[n % S.length])
372
-
373
- .join("");
374
-
375
-
376
-
377
- let self = this;
378
-
379
- let fileReader = new FileReader();
380
-
381
- fileReader.onload = function() {
382
-
383
- self.preview = fileReader.result;
384
-
385
- };
386
-
387
- fileReader.readAsDataURL(this.file);
388
-
389
- },
390
-
391
- uploadImage() {
392
-
393
- const uploadTask = firebase
394
-
395
- .storage()
396
-
397
- .ref(this.uploadUrl) //さっき決めたパスを参照して、
398
-
399
- .put(this.file) //保存する
400
-
401
-
402
-
403
- uploadTask
404
-
405
- .then(() => {
406
-
407
- uploadTask.snapshot.ref.getDownloadURL().then((fileUrl)=>{
408
-
409
- const uploadedImage = {
410
-
411
- fileUrl: fileUrl,
412
-
413
- time: firebase.firestore.FieldValue.serverTimestamp(),
414
-
415
- };
416
-
417
- firebase
418
-
419
- .firestore()
420
-
421
- .collection("users") //保存する場所を参照して、
422
-
423
- .doc(this.$route.params.uid) //追加で保存setメソッドを使うと上書きされる
424
-
425
- .set(
426
-
427
- {
428
-
429
- name: this.name,
430
-
431
- sex: this.sex,
432
-
433
- age: this.age,
434
-
435
- access: this.access,
436
-
437
- selfpr: this.selfpr,
438
-
439
- profession: this.profession,
440
-
441
- genre: this.genre,
442
-
443
- favMovie: this.favMovie,
444
-
445
- uploadedImage: uploadedImage,
446
-
447
- time: firebase.firestore.FieldValue.serverTimestamp(),
448
-
449
- },
450
-
451
- { merge: true }
452
-
453
- );
454
-
455
- console.log(fileUrl);
456
-
457
- })
458
-
459
- });
460
-
461
- },
462
-
463
471
  },
464
472
 
465
473
  ```

6

内容修正

2021/05/29 14:10

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -475,3 +475,5 @@
475
475
 
476
476
 
477
477
  [【Vue x Storage】プロフィール画像を選択後、選択した画像を表示させたいです。](https://qiita.com/TMTN/questions/5446a1dec75c3682dcbb)
478
+
479
+ [【Vue x Storage】プロフィール画像を選択後、選択した画像を表示させたい](https://ja.stackoverflow.com/questions/76127/vue-x-storage-%e3%83%97%e3%83%ad%e3%83%95%e3%82%a3%e3%83%bc%e3%83%ab%e7%94%bb%e5%83%8f%e3%82%92%e9%81%b8%e6%8a%9e%e5%be%8c-%e9%81%b8%e6%8a%9e%e3%81%97%e3%81%9f%e7%94%bb%e5%83%8f%e3%82%92%e8%a1%a8%e7%a4%ba%e3%81%95%e3%81%9b%e3%81%9f%e3%81%84)

5

内容修正

2021/05/27 17:40

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -6,9 +6,9 @@
6
6
 
7
7
  既存画像から(選択されていない場合デフォルト画像にしてます)選択された画像に切り替えたいです。
8
8
 
9
- しかし、現状は切り替わらず「更新ボタン」を押下して発火させた後、プロフィール画面での表示はきちんと表示されますが
9
+ しかし、現状は切り替わらず「更新ボタン」を押下して発火させた後、プロフィール画面での表示は
10
-
10
+
11
- 「更新ボタン」を押すまでは編集画面では選択画像が変わらない状態です・・
11
+ きちんと表示されますが「更新ボタン」を押すまでは編集画面では選択画像が変わらない状態です・・
12
12
 
13
13
 
14
14
 

4

追記1追加

2021/05/27 10:22

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -463,3 +463,15 @@
463
463
  },
464
464
 
465
465
  ```
466
+
467
+
468
+
469
+ #追記1
470
+
471
+
472
+
473
+ 長期間回答が得られなかった為、以下サイトにも掲載させて頂いております。
474
+
475
+
476
+
477
+ [【Vue x Storage】プロフィール画像を選択後、選択した画像を表示させたいです。](https://qiita.com/TMTN/questions/5446a1dec75c3682dcbb)

3

内容修正

2021/05/25 13:33

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -50,6 +50,8 @@
50
50
 
51
51
 
52
52
 
53
+ #実際のコード
54
+
53
55
 
54
56
 
55
57
  ```ここに言語を入力

2

内容訂正。

2021/05/25 13:19

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
@@ -1,10 +1,4 @@
1
- #プロフィール画像を選択後、選択した画像を表示させたいです。
1
+ #プロフィール画像を選択後、リアルタイムで選択した画像を表示させたいです。
2
-
3
-
4
-
5
- 下記コードより@change="onFileChange"にて画像を選択して、Storageに保存、
6
-
7
- 保存したデータを他で表示することはできているのですが
8
2
 
9
3
 
10
4
 
@@ -14,7 +8,7 @@
14
8
 
15
9
  しかし、現状は切り替わらず「更新ボタン」を押下して発火させた後、プロフィール画面での表示はきちんと表示されますが
16
10
 
17
- 「更新ボタン」を押すまでは編集画面では選択画像が変わらない状態です・・
11
+ 「更新ボタン」を押すまでは編集画面では選択画像が変わらない状態です・・
18
12
 
19
13
 
20
14
 

1

タグ追加

2021/05/23 04:13

投稿

TMTN
TMTN

スコア53

test CHANGED
File without changes
test CHANGED
File without changes