【外卖系统】文件上传与下载

news2024/12/24 12:14:50

文件上传

文件上传又称upload,将本地图片、视频等文件上传到服务器上,供其他用户下载或者浏览。

form表单:HTML中的form元素用于创建一个包含表单字段的区域,用户可以在该区域输入数据,并通过提交表单将数据发送到服务器进行处理。表单是Web应用中收集用户输入的主要方式之一。
form元素包含了一个或多个表单字段,如输入框、复选框、单选按钮、下拉列表等,这些字段用于接受用户输入。每个表单字段都有一个相关的名字(name)和值(value)。当用户提交表单时,浏览器会将表单字段的名字和值一并发送到服务器。 form元素的常用属性包括: - action:指定表单提交的目标URL,即处理表单数据的服务器端脚本; - method:指定表单提交的HTTP方法,常用的有GET和POST; - enctype:指定表单数据的编码方式,常用的有application/x-www-form-urlencoded和multipart/form-data; - target:指定表单提交后处理结果的展示方式,如在当前窗口打开或在新窗口打开。
用户在填写表单字段后,可以点击提交按钮将数据发送到服务器。提交按钮通常使用input元素的type属性为"submit"来创建。用户点击提交按钮后,浏览器会将表单字段的名字和值封装成一个HTTP请求,并发送到服务器。服务器端的脚本可以通过读取这些字段的名字和值来处理用户提交的数据。
通过使用form元素,开发者可以创建各种类型的表单,用于收集用户输入的数据,并将数据发送到服务器进行处理和存储。

文件上传时的要求:

  • post方式提交数据,method=“post”
  • multipart格式上传文件,enctype=“multipart/form-data”
  • 使用input的file控件上传,type=file
    Spring框架在spring-web包中对文件上传进行了封装,只需在Controller的方法中声明一个MuitipartFile类型的参数即可接收上传的文件

代码实现

前端
在这里插入图片描述后台
在这里插入图片描述后台方法中的参数名file需要和前端中的对应,不能随意命名。

 /**
     * 文件上传
     * @param file
     * @return
     */

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file)
    {
        //file是一个临时文件 需要转存到指定位置 否则本次请求完成后临时文件会被删除
        log.info(file.toString());
        try{
            //将临时文件转存到指定位置
            file.transferTo((new File("D:\\hello.jpg")));
        }catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }

可以看到是转存成功的
在这里插入图片描述将固定的转存地址改为动态的,程序可配置的
在这里插入图片描述

在这里插入图片描述具体代码如下:需要修改.yml文件的配置

server:
  port: 8060 #配置时 tomcat的端口号

spring:
  application:
    name: my_reggie #应用的名称 可以自定义
  #datasource:
  #  druid:
  #    driver-class-name: com.mysql.cj.jdbc.Driver
  #    url: jdbc:mysql://localhost:3306/ruiji?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
  #    username: root
  #    password: 333
  shardingsphere:
    datasource:
      names:
        master,slave
      # 主库(增删改操作)
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/reggie?characterEncoding=utf-8
        username: root
        password: 111111
      # 从数据源(读操作)
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/reggie?characterEncoding=utf-8
        username: root
        password: 111111
    masterslave:
      # 读写分离配置
      load-balance-algorithm-type: round_robin #轮询(如果有多个从库会轮询着读)
      # 最终的数据源名称
      name: dataSource
      # 主库数据源名称
      master-data-source-name: master
      # 从库数据源名称列表,多个逗号分隔
      slave-data-source-names: slave
    props:
      sql:
        show: true #开启SQL显示,默认false
  main:
    allow-bean-definition-overriding: true



  redis:
    host: localhost # 本地IP 或是 虚拟机IP
    port: 6379
    #    password: root
    database: 0  # 默认使用 0号db
  cache:
    redis:
      time-to-live: 1800000  # 设置缓存数据的过期时间,30分钟

mybatis-plus:
  configuration:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,开启按照驼峰命名法映射
    map-underscore-to-camel-case: true #将以下划线作分隔符的部分 换成大写字母
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: ASSIGN_ID

#自定义的文件上传存储位置
#takeOutFile:
 # fileLocaltion: D:\my_reggie\takeOutUploadFile

#视频里面的路径
reggie:
   path: D:\
 @PostMapping("/upload")
    public R<String> upload(MultipartFile file)
    {
        //file是一个临时文件 需要转存到指定位置 否则本次请求完成后临时文件会被删除
        log.info(file.toString());
        try{
            //将临时文件转存到指定位置
            file.transferTo(new File(basePath + "hello.jpg"));
        }catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }

改转换后图片的名字:改成原始的文件名
在这里插入图片描述在这里插入图片描述

@PostMapping("/upload")
    public R<String> upload(MultipartFile file)
    {
        //file是一个临时文件 需要转存到指定位置 否则本次请求完成后临时文件会被删除
        log.info(file.toString());

        //原始文件名
        String originalFilename = file.getOriginalFilename();
        try{
            //将临时文件转存到指定位置
            file.transferTo(new File(basePath + originalFilename));
        }catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }

为了防止命名重复又改成了随机命名
在这里插入图片描述

public class CommonController {
    @Value("${reggie.path}")
    private String basePath;
    /**
     * 文件上传
     * @param file
     * @return
     */

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file)
    {
        //file是一个临时文件 需要转存到指定位置 否则本次请求完成后临时文件会被删除
        log.info(file.toString());

        //原始文件名
        String originalFilename = file.getOriginalFilename();
       String suffix =  originalFilename.substring(originalFilename.lastIndexOf("."));

        //使用UUID重新生成文件名,防止文件名称重复造成的文件覆盖
         String fileName = UUID.randomUUID().toString()+suffix;
        try{
            //将临时文件转存到指定位置
            file.transferTo(new File(basePath + fileName));
        }catch (IOException e)
        {
            e.printStackTrace();
        }
        return null;
    }

http://localhost:8060/backend/page/demo/upload.html
存到一个指定文件夹下:

  //创建目录对象
        File dir = new File(basePath);
        //判断当前目录是否存在
        if(!dir.exists())
        {
            dir.mkdirs();
        }

在这里插入图片描述添加返回值

return R.success(fileName);

文件下载

文件下载又称download,将文件从服务器传到本地计算机

代码实现

通过输出流向浏览器页面写回数据

/**
     * 文件下载
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void download(String name,HttpServletResponse response)
    {
        //输入流 通过输入流读取文件内容
        try {
            FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
            //输出流 通过输出流文件写回浏览器 在浏览器展示图片
            ServletOutputStream outputStream = response.getOutputStream();
            response.setContentType("image/jpeg");
            int len = 0;
            byte[] bytes = new byte[1024];
            while((len = fileInputStream.read(bytes)) != -1)
            {
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }
            //关闭资源
            outputStream.close();
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/817383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL初探

Background 通过阅读小林coding&#xff0c;大致了解了mysql数据库的种种特点&#xff0c;与之前学的数据库实现大体思路相同&#xff0c;感觉学习不能停留在理论层面&#xff0c;要调研生产级别的中间件实现。 一条代码运行在mysql上的流程 1. 连接的过程需要先经过 TCP 三次…

[回馈]ASP.NET Core MVC开发实战之商城系统(四)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;在之前的文章中&#xff0c;讲解了商城系统的整体功能设计&#xff0c;页面布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页【商品类型&#xff0c;ba…

Structure Guided Lane Detection 论文精度

结构导向车道检测 摘要 近年来&#xff0c;随着深度神经网络和自动驾驶的快速发展&#xff0c;车道检测取得了长足的进步。然而&#xff0c;主要存在三个问题&#xff0c;包括车道的特征化、场景与车道之间的结构关系建模以及对车道的更多贡献&#xff08;如实例和类型&#…

手搓 自然语言模型 各种对比数据

基础模型和设计思想 最优网络结构 import paddle import numpy as np from tqdm import tqdm class EmMask(paddle.nn.Layer):def __init__(self, voc_size19, hidden_size256, max_len48):super(EmMask, self).__init__()# 定义输入序列和标签序列self.embedding_layer pad…

Unity3d C#快速打开萤石云监控视频流(ezopen)支持WebGL平台,替代UMP播放视频流的方案(含源码)

前言 Universal Media Player算是视频流播放功能常用的插件了&#xff0c;用到现在已经不知道躺了多少坑了&#xff0c;这个插件虽然是白嫖的&#xff0c;不过被甲方和领导吐槽的就是播放视频流的速度特别慢&#xff0c;可能需要几十秒来打开监控画面&#xff0c;等待的时间较…

我的第一个前端(VS code ,Node , lite-server简易服务器,npm 运行)

第一种方式&#xff1a;使用Visual Studio Code创建并运行 第一个前端项目的步骤&#xff0c;如下&#xff1a; 1. 下载和安装Visual Studio Code&#xff1a; 访问Visual Studio Code官方网站&#xff08;Visual Studio Code - Code Editing. Redefined&#xff09;并根据你…

二十三种设计模式第二十篇--备忘录模式

备忘录模式&#xff0c;备忘录模式属于行为型模式。它允许在不破坏封装的情况下捕获和恢复对象的内部状态。保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;该模式通过创建一个备忘录对象来保存原始对象的状态&#xff0c;并将其存储在一个负责管理备…

133. 克隆图

给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。 class Node { public int val; public List&…

互联网医院系统开发:打造便捷高效的医疗服务平台

随着互联网技术的飞速发展&#xff0c;互联网医院系统的出现为医疗行业带来了许多新的机遇和优势。互联网医院系统是一种基于互联网技术的医疗服务平台&#xff0c;旨在提供便捷、高效、个性化的医疗服务。下面将介绍互联网医院系统开发的优势。   提供便捷的医疗服务&#x…

【模仿学习】:离线和在线模仿

一、说明 模仿学习&#xff08;Imitation Learning &#xff09;是机器学习的一种&#xff0c;代理通过观察和模仿专家的行为来学习。在这种方法中&#xff0c;为代理提供了一组所需行为的演示或示例&#xff0c;并通过尝试复制专家的行为来学习输入观察和输出操作之间的映射。…

【单机多卡】torch改造代码为DDP单机多卡分布式并行

torch分布式数据并行DDPtorch.nn.parallel.DistributedDataParallel代码修改记录。&#xff08;要求pytorch_version>1.0&#xff09; 目录 1.&#x1f344;&#x1f344;要修改的地方概览 2.✏️✏️初始化 3.✏️✏️设置当前进程GPU 4.✏️✏️设置sampler 5.✏️✏…

HTML笔记(1)

介绍 浏览器中内置了HTML的解析引擎&#xff0c;通过解析标记语言来展现网页&#xff1b;HTML标签都是预定义好的&#xff1b;Java工程师&#xff1a;后台代码的编写&#xff0c;和数据库打交道&#xff0c;把数据给网页前端的工程师&#xff1b;网页前端工程师&#xff1a;写H…

拯救者Y9000K无线Wi-Fi有时不稳定?该如何解决?

由于不同品牌路由器的性能差异&#xff0c;无法完美兼容最新的无线网卡技术&#xff0c;在连接网络时&#xff08;特别是网络负载较大的情况下&#xff09;&#xff0c;可能会出现Wi-Fi信号断开、无法网络无法访问、延迟突然变大的情况&#xff1b;可尝试下面方法进行调整。 1…

go 如何知道一个对象是分配在栈上还是堆上?

如何判断变量是分配在栈&#xff08;stack&#xff09;上还是堆&#xff08;heap&#xff09;上&#xff1f; Go和C不同&#xff0c;Go局部变量会进行逃逸分析。如果变量离开作用域后没有被引用&#xff0c;则优先分配到栈上&#xff0c;否则分配到堆上。判断语句&#xff1a;…

Stable Doodle:Stability AI推出的一款零门槛AI绘画神器

Stable Doodle是由Stability AI推出的一款零门槛AI绘画神器&#xff0c;可以将简单的草图转化为精美的图像。它可以将随手的塗鴉草稿转化为高畫質的完成圖&#xff0c;让用户能够以更快的速度将想法转化为精美的艺术作品。Stable Doodle利用最新的Stable Diffusion模型&#xf…

智能车域控制器设计

摘要: 本文主要针对ADCU从硬件设计到软件设计的开发流程进行详细阐述,主要包含了需求场景、关键硬件电路、电路可靠性、AUTOSAR架构、CAN通信简介、CAN通信软件设计等。最后基于以上硬件技术和软件技术开发出一款产品级智能驾驶域控制器。 // 智能驾驶域控制器研究现状 //…

iOS开发-实现自定义Tabbar及tabbar按钮动画效果

iOS开发-实现自定义Tabbar及tabbar按钮动画效果 之前整理了一个继承UITabbarController的Tabbar效果 查看 https://blog.csdn.net/gloryFlow/article/details/132012628 这里是继承与UIViewController的INSysTabbarViewController实现及点击tabbar按钮动画效果。 一、INSysT…

学习记录——TransNormerLLM

Scaling TransNormer to 175 Billion Parametes 线性注意力的Transformer大模型 2023 Transformer 存在局限。首要的一点&#xff0c;它们有着对于序列长度的二次时间复杂度&#xff0c;这会限制它们的可扩展性并拖累训练和推理阶段的计算资源和时间效率。 TransNormerLLM 是首…

中小企业如何低成本实施MES管理系统

中小企业在市场竞争中需要有高效的管理体系来支持其运营和发展。中小企业MES管理系统是一种先进的管理系统&#xff0c;可以提升工厂智能化水平&#xff0c;提高生产效率&#xff0c;是中小企业必须采取的有效管理工具。然而&#xff0c;由于资金和技术的限制&#xff0c;中小企…

Java API指南:掌握常用工具类与字符串操作

文章目录 1. API简介2. Java API的使用2.1 创建和使用Java API工具类2.2 使用String类进行字符串操作 结语 导语&#xff1a; Java作为一门功能强大的编程语言&#xff0c;其成功之处不仅在于语法结构的简洁明了&#xff0c;更因为其丰富的API&#xff08;Application Programm…