主体思路与导航菜单管理相同,唯一的区别是这里有文件上传需求,所以我们这里重点关注文件上传问题
🚩 源代码: step-80
目前遇到的问题是,我们需要在点击保存按钮之前,将图片上传到服务器,并且可以获取到图片的访问路径。
由于我们这里的轮播管理采用的是 AJAX 方式维护,使用之前的表单方式肯定没法在这里使用了(同步方式),这里必须有一种异步上传文件的方式:
明确问题:在选择完图片过后,异步将文件上传到服务端,并获取这张图片的访问路径。
添加一个支持上传文件的接口 upload.php
1// 如果选择了文件 $_FILES['file']['error'] => 0
2if (empty($_FILES['file']['error'])) {
3 // PHP 在会自动接收客户端上传的文件到一个临时的目录
4 $temp_file = $_FILES['file']['tmp_name'];
5 // 我们只需要把文件保存到我们指定上传目录
6 $target_file = '../static/uploads/' . $_FILES['file']['name'];
7 if (move_uploaded_file($temp_file, $target_file)) {
8 $image_file = '/static/uploads/' . $_FILES['file']['name'];
9 }
10}
11
12// 设置响应类型为 JSON
13header('Content-Type: application/json');
14
15if (empty($image_file)) {
16 echo json_encode(array(
17 'success' => false
18 ));
19} else {
20 echo json_encode(array(
21 'success' => true,
22 'data' => $image_file
23 ));
24}
🚩 源代码: step-81
1/**
2 * 异步上传文件
3 */
4$('#upload').on('change', function () {
5 // 准备要上传的数据
6 var formData = new FormData()
7 formData.append('file', this.files[0])
8
9 // 发送 AJAX 请求,上传文件
10 var xhr = new XMLHttpRequest()
11 xhr.open('POST', '/admin/upload.php')
12 xhr.addEventListener('load', function () {
13 var res = JSON.parse(xhr.response)
14 console.log(res)
15 })
16 xhr.send(formData)
17})
🚩 源代码: step-82
jQuery 也是可以的(内部仍然是使用的 XMLHttpRequest level 2)
1/**
2 * 异步上传文件
3 */
4$('#upload').on('change', function () {
5 // 准备要上传的数据
6 var formData = new FormData()
7 formData.append('file', this.files[0])
8
9 // 发送 AJAX 请求,上传文件
10 $.ajax({
11 url: '/admin/upload.php',
12 cache: false,
13 contentType: false,
14 processData: false,
15 data: formData,
16 type: 'post',
17 success: function (res) {
18 if (res.success) {
19 $('#image').val(res.data).siblings('.thumbnail').attr('src', res.data).fadeIn()
20 } else {
21 $('#image').val('').siblings('.thumbnail').fadeOut()
22 notify('上传文件失败')
23 }
24 }
25 })
26})
🚩 源代码: step-83