vant+thinkphp实现文件上传功能

news/2024/7/10 3:06:56 标签: php, 前端, vue

vant+thinkphp实现文件上传功能

前端

vue3 +vant
代码实现
fileList 预览文件列表,具体可以参考官方文档

let config = {
headers: {
//添加请求头
“Content-Type”: “multipart/form-data”,
},
};

需要以form-data的形式上传文件,所以在发起请求之前需要配置一个请求头

<script setup>
import {ref } from "vue";
import axios from "axios";
import { showToast } from "vant";

const fileList = ref([
  // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明
]);

const afterRead = (file) => {
  // 创建 FormData 对象
  const formData = new FormData();

  // 遍历所有选定的文件并附加到 FormData 对象中
  formData.append("files[]", file.file);

  // 上传文件的目标 URL
  const uploadUrl = "http://127.0.0.1:8000/upload";

  let config = {
    headers: {
      //添加请求头
      "Content-Type": "multipart/form-data",
    },
  };

  // 发送 POST 请求
  axios
    .post(uploadUrl, formData, config)
    .then((response) => {
      // 处理上传成功的情况
      showToast("上传成功");
      console.log("文件上传成功:", response.data.data);
    })
    .catch((error) => {
      // 处理上传失败的情况
      showToast("文件上传失败")
      console.log("文件上传失败,请稍后重试", error);
    });
};
</script>

<template>
  <div class="mine">
    <!-- 设置 multiple 属性允许多文件选择 -->
    <van-uploader :after-read="afterRead" multiple v-model="fileList" />
  </div>
</template>

php_66">thinkphp后端

修改config/filesystem.php

php"><?php

return [
    // 默认磁盘
    'default' => env('filesystem.driver', 'local'),
    // 磁盘列表
    'disks'   => [
        'local'  => [
            'type' => 'local',
            'root' => app()->getRuntimePath() . 'storage',
        ],
        'public' => [
            // 磁盘类型
            'type'       => 'local',
            // 磁盘路径
            'root'       => app()->getRootPath() . 'public/uploads',
            // 磁盘路径对应的外部URL路径
            'url'        => '/uploads',
            // 可见性
            'visibility' => 'public',
        ],
        // 更多的磁盘配置信息
    ],
];

新建一个upload类用来实现文件上传的逻辑

php"><?php

namespace app\controller;

use think\Facade\Request;
use app\BaseController;

class Upload extends BaseController
{
    public function index()
    {
        $files = request()->file('files');

        foreach ($files as $file) {
            $ext = $file->getOriginalExtension();
            //不同文件,储存不同的文件夹
            $folder = config('filesystem.disks.folder') . '/uploads/' . $ext; //以文件后缀名作为存文件的存放目录
            if (!file_exists($folder))
                mkdir($folder, 0700, TRUE); //如果文件夹不存在,则创建


            $savename = \think\facade\Filesystem::disk('public')
                ->putFile('', $file, 'md5'); //上传文件,得到上传之后的文件名称

            if (!$savename) {
                return json([
                    "code"=>400,
                    "msg"=>"文件上传失败",
                    "data"=>null
                ]);
            } else {
                $savename = '' . str_replace("\\", "/", $savename);
                if ($savename) {
                    return json([
                        "code" => 200,
                        "msg" => "文件上传成功",
                        "data" => Request::domain() . '/uploads/' . $savename,
                        //因为要返回给前端网址,这里要加上域名 Request::domain()
                    ]);
                } 
            }

        }
      
    }
}

上传成功返回图片的url地址,可以用来当做用户的头像,或者商品的图片等

设置路由

php">Route::post("/upload","upload/index");

设置跨域请求

php"><?php

namespace app\middleware;

class CorsMiddleware
{
    public function handle($request, \Closure $next)
    {
        // 设置允许跨域的域名,* 表示允许任何域名访问
        $origin = '*';

        // 设置允许的请求方法
        $methods = 'GET, POST, PUT, DELETE';

        // 设置允许的请求头字段
        $headers = 'Origin, X-Requested-With, Content-Type, Accept';

        // 设置响应头
        header("Access-Control-Allow-Origin: *");
        header("Access-Control-Allow-Methods: *");
        header("Access-Control-Allow-Headers: *");

        // 对预检请求进行处理
        if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
            header("Access-Control-Allow-Credentials: true");
            header('Access-Control-Max-Age: 86400'); // 预检请求的有效期,单位秒
            header("Content-Length: 0");
            header("Content-Type: text/plain");
            exit();
        }

        // 继续处理请求
        return $next($request);
    }
}

在middleware.php中挂载中间件路由

php"><?php
// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
    // \think\middleware\SessionInit::class

    \app\middleware\CorsMiddleware::class
];

测试

用postman上传测试
上传成功返回上传图片的url地址
在这里插入图片描述
vue中测试

在这里插入图片描述


http://www.niftyadmin.cn/n/5176215.html

相关文章

“图像识别在智能交通系统中的应用与优化“

智能交通系统中的图像识别应用和优化是现代城市发展中的重要组成部分。以下是图像识别在智能交通系统中的主要应用和一些优化方向&#xff1a; 图像识别在智能交通系统中的应用&#xff1a; 车辆识别与跟踪&#xff1a; 图像识别用于识别和跟踪车辆&#xff0c;包括识别车牌号…

Python实现cpu密集型多线程

问题&#xff1a; 想通过以下代码实现多线程 class ThreadTest(threading.Thread):def __init__(self, num, *args, **kwargs):super(ThreadTest, self).__init__(*args, **kwargs)self.num numprint(num)def run(self):print(self.num)print(time.time())if __name__ &quo…

如何应对招聘中的职业性格测评?

很多同学听说要做性格测试&#xff0c;第一反应是如何让自己的性格让HR看起来更好....没办法为了顺利入职&#xff0c;咱不能老实作答&#xff0c;因为性格测评搞不好是真刷人的&#xff0c;刷人的&#xff08;无视你的专业能力和笔试成绩&#xff09;..... 可是....很多性格测…

SDL2 加载图片

1.简介 在SDL中&#xff0c;本身只支持加载BMP格式的图片SDL_LoadBMP&#xff0c;如果想要加载别的格式图片&#xff0c;需要编译SDL_image库。 SDL_image库中IMG_Load和都是IMG_LoadTexture用于加载图片的函数&#xff0c;但是它们的使用方式和返回值有所不同。 IMG_Load和…

服务等级目标SLO概述

服务等级目标SLO概述 更新时间&#xff1a;2023-08-22 09:50 阿里云服务网格ASM提供了开箱即用的基于服务等级目标SLO&#xff08;Service Level Objectives&#xff09;的监控和告警能力&#xff0c;能够监控应用服务之间调用的延迟和错误率特征等。本文介绍SLO的相关概念。…

企业数据备份方案:如何选择适合企业的备份方法?

企事业单位通常配备文件服务器以存储涉及单位无形资产和商业机密的重要数据文件。尽管许多文件服务器配备了Raid以防止数据丢失风险&#xff0c;但员工恶意访问或黑客入侵仍可能导致数据的删除、恶意修改或加密。因此&#xff0c;为维护数据安全&#xff0c;企业需要及时备份操…

USB拦截工具

USB 闪存驱动器对组织的安全和数据构成了独特的威胁。它们的便携性和充足的存储容量使它们成为数据盗窃的便捷媒介。 什么是 USB 拦截器 USB&#xff08;通用串行总线&#xff09;阻止程序用于禁用插入可移动存储设备的端口&#xff0c;便携性和充足的存储容量使 USB 成为可能…

2023年上海市安全员B证证模拟考试题库及上海市安全员B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年上海市安全员B证证模拟考试题库及上海市安全员B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;上海市安全员B证证模拟考试题库是根据上海市安全员B证最新版教材&#xff0c;上海市安全员B证大纲整理…