質問編集履歴

1

ソースコードの追加

2021/08/25 02:10

投稿

sekaino_usay
sekaino_usay

スコア0

test CHANGED
File without changes
test CHANGED
@@ -7,3 +7,297 @@
7
7
  ### 自分で試したこと
8
8
 
9
9
  [こちら](https://blog.capilano-fw.com/?p=4452)の記事を試し、うまくできたのですが、もう少しシンプルに(外部のライブラリを使わずに)実装したいです。それがもし無理なら、ファイルをアップロードした後、フォームのアクション先に飛びたいです。
10
+
11
+
12
+
13
+ ### ソースコード
14
+
15
+ #### index.html(フォーム)
16
+
17
+ ```HTML
18
+
19
+ <html>
20
+
21
+
22
+
23
+ <head>
24
+
25
+ <meta charset="utf-8">
26
+
27
+ <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
28
+
29
+ </head>
30
+
31
+
32
+
33
+ <body>
34
+
35
+ <div id="app" class="container">
36
+
37
+ <div class="row" v-if="!uploading">
38
+
39
+ <div class="col-6">
40
+
41
+ <input type="file" name="file" @change="onSelectFile">
42
+
43
+ </div>
44
+
45
+ <div class="col-6">
46
+
47
+ <button type="button" class="btn btn-outline-primary" @click="onSubmit">送信</button>
48
+
49
+ </div>
50
+
51
+ </div>
52
+
53
+ <div class="row" v-else>
54
+
55
+ <div class="col-12 text-center">
56
+
57
+ <!-- プログレスバー(HTML5) -->
58
+
59
+ <progress ref="progress" value="0" max="100"></progress>
60
+
61
+ <br>
62
+
63
+ <span class="text-muted">アップロード中...</span>
64
+
65
+ </div>
66
+
67
+ </div>
68
+
69
+ </div>
70
+
71
+ <!-- Vue -->
72
+
73
+ <script src="https://cdn.jsdelivr.net/npm/vue@2.6.0"></script>
74
+
75
+ <!-- axios -->
76
+
77
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.0/axios.min.js"></script>
78
+
79
+ <script>
80
+
81
+ new Vue({
82
+
83
+ el: '#app',
84
+
85
+ data: {
86
+
87
+ file: null,
88
+
89
+ uploading: false
90
+
91
+ },
92
+
93
+ methods: {
94
+
95
+ onSubmit() {
96
+
97
+
98
+
99
+ const url = './up.php';
100
+
101
+ let formData = new FormData();
102
+
103
+ formData.append('file', this.file);
104
+
105
+
106
+
107
+ if (this.file === null) {
108
+
109
+
110
+
111
+ alert('ファイルを選択してください');
112
+
113
+ return;
114
+
115
+
116
+
117
+ }
118
+
119
+
120
+
121
+ this.uploading = true;
122
+
123
+
124
+
125
+ axios.post(url, formData, { onUploadProgress: this.onUpload })
126
+
127
+ .then((response) => {
128
+
129
+
130
+
131
+ // アップロード完了
132
+
133
+ alert('アップロードが完了しました!');
134
+
135
+ window.location.href = "./up.php"
136
+
137
+
138
+
139
+ })
140
+
141
+ .catch((error) => {
142
+
143
+
144
+
145
+ // エラーが発生
146
+
147
+ alert('エラーが発生しました。もう一度やり直してください。');
148
+
149
+
150
+
151
+ })
152
+
153
+ .then(() => {
154
+
155
+
156
+
157
+ this.$refs.progress.value = 0; // プログレスをクリア
158
+
159
+ this.uploading = false;
160
+
161
+
162
+
163
+ });
164
+
165
+
166
+
167
+ },
168
+
169
+ onSelectFile(e) { // ファイル選択時
170
+
171
+
172
+
173
+ const files = e.target.files;
174
+
175
+
176
+
177
+ if (files.length === 0) { // ファイル選択がキャンセルされた時
178
+
179
+
180
+
181
+ this.file = null;
182
+
183
+ return;
184
+
185
+
186
+
187
+ }
188
+
189
+
190
+
191
+ this.file = files[0];
192
+
193
+
194
+
195
+ },
196
+
197
+ onUpload(e) {
198
+
199
+
200
+
201
+ // プログレスバーを計算して変更
202
+
203
+ this.$refs.progress.value = Math.floor((e.loaded * 100) / e.total);
204
+
205
+
206
+
207
+ }
208
+
209
+ }
210
+
211
+ });
212
+
213
+ </script>
214
+
215
+ </body>
216
+
217
+
218
+
219
+ </html>
220
+
221
+ ```
222
+
223
+
224
+
225
+ #### up.php(アップロード処理)
226
+
227
+ ```php
228
+
229
+ <?php
230
+
231
+ //変数を作成
232
+
233
+ $tempfile = $_FILES['file']['tmp_name'];
234
+
235
+ $file = $_FILES['file']['name'];
236
+
237
+
238
+
239
+ //ランダム文字列作成(同一ファイル名回避)
240
+
241
+ $random = chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122));
242
+
243
+
244
+
245
+ //リネーム
246
+
247
+ $filename = $_SERVER['REQUEST_TIME'].'-'.$random.'.'.pathinfo($file)['extension'];
248
+
249
+
250
+
251
+ //データ保存用ディレクトリ
252
+
253
+ $directory = './data/';
254
+
255
+
256
+
257
+ //アップロード先URL
258
+
259
+ $domain = $_SERVER['HTTP_HOST'];
260
+
261
+ $url = 'https://'.$domain.'/data/'.$filename;
262
+
263
+
264
+
265
+ //データ保存用ディレクトリが存在しなければ作成
266
+
267
+ if (file_exists($directory)) {
268
+
269
+ ;
270
+
271
+ } else {
272
+
273
+ mkdir($directory);
274
+
275
+ }
276
+
277
+
278
+
279
+ //ファイルアップロード
280
+
281
+ if (is_uploaded_file($tempfile)) {
282
+
283
+ if ( move_uploaded_file($tempfile , $directory.$filename )) {
284
+
285
+ echo '<a href="'.$url.'" target="_blank">'.$file.'</a>をアップロードしました。<br>';
286
+
287
+ echo 'ファイルのURLは<a href="'.$url.'" target="_blank">'.$url.'</a>です。';
288
+
289
+ } else {
290
+
291
+ echo "ファイルをアップロードできません。";
292
+
293
+ }
294
+
295
+ } else {
296
+
297
+ echo "ファイルが選択されていません。";
298
+
299
+ }
300
+
301
+ ?>
302
+
303
+ ```