SpringBoot案例-文件上传

目录

简介

文件上传前端页面三要素

 服务端接收文件

小结

本地储存

实现

代码优化

小结 

阿里云OSS

阿里云

阿里云OSS

使用第三方服务--通用思路

 准备工作

参照官方SDK代码,编写入门程序

集成使用

阿里云OSS-使用步骤

阿里云OSS使用步骤

参照SDK编写入门程序

案例集成OSS (文件上传接口的实现)

 引入阿里云OSS工具类

控制类

测试 

前后端联调 

小结

文件上传介绍

前端页面三要素(file表单项、post方法、multipart/form-data)

服务端接口接收文件(Multipart)

文件存储方式


简介

  • 文件上传,是指将本地图片、视频、音频等文件上传至服务器,供其他用户浏览或者下载的过程
  • 文件上传在项目中应用非常广泛,我们经常发微博、发朋友圈都要用到文件上传功能。

文件上传前端页面三要素

表单项file

表单提交方式

表单的编码格式

上述页面运行结果为:

 服务端接收文件

控制类代码如下:

package com.example.tlias.controller;import com.example.tlias.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;@RestController
@Slf4jpublic class UpLoadController {@PostMapping("upload")public Result upload(String username, Integer age, MultipartFile image) {log.info("文件上传,name:{},age:{},image:{}", username, age, image);return Result.success();}}

 调试运行SpringBoot项目,在浏览器中访问html前端页面,设置程序断点,如果不设置断点,程序运行完成之后,接收的临时文件会自动删除。具体示意如下:

然后在浏览器中访问前端页面

点击提交后, 程序终端显示如下:

 显示接收到前端的数据以及数据临时存放的位置

小结

  • 前端页面三要素
    • 表单项 type=“file”
    • 表单提交方式 post
    • 表单的enctype属性 multipart/form-data
  • 服务端接收wenjian
    • MultipartFile

本地储存

实现

  • 在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中
  • 具体控制类代码如下
    • package com.example.tlias.controller;import com.example.tlias.pojo.Result;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.multipart.MultipartFile;import java.io.File;
      import java.io.IOException;@RestController
      @Slf4jpublic class UpLoadController {@PostMapping("upload")public Result upload(String username, Integer age, MultipartFile image) throws IOException {log.info("文件上传,name:{},age:{},image:{}", username, age, image);//  todo 获取原始文件名String name = image.getOriginalFilename();//  todo 将文件存储在服务器指定的磁盘目录中image.transferTo(new File("D:\\downloadFile\\" + name));return Result.success();}}
      

使用psotman进行测试

具体请求路径以及请求参数如下

在对应的文件目录中显示如下:

成功将前端传递的文件存储到本地服务器的磁盘中 

代码优化

  • 存在的问题:当前端传递的文件名称相同时,就会出现文件覆盖的问题
  • 问题的解决:为每一个接收到的文件重新设置一个新的名字即可,新的名字由UUID以及该文件的后缀名组成,UUID使用java自带的aip进行生成,后缀名通过截取文件原名称所得
  • 具体代码如下:
    • package com.example.tlias.controller;import com.example.tlias.pojo.Result;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.multipart.MultipartFile;import java.io.File;
      import java.io.IOException;
      import java.util.UUID;@RestController
      @Slf4jpublic class UpLoadController {@PostMapping("upload")public Result upload(String username, Integer age, MultipartFile image) throws IOException {log.info("文件上传,name:{},age:{},image:{}", username, age, image);//  todo 获取原始文件名,但是不同文件的原始文件名可能相同String name = image.getOriginalFilename();// todo 构造唯一文件名--uuid(通用唯一识别码)// 获取文件后缀名int index = name.lastIndexOf(".");//获取最后的.的索引位置String extname = name.substring(index);//进行截取String newName = UUID.randomUUID().toString() + extname;//创建唯一文件名log.info("获取到的新的文件名为:{}", newName);//  todo 将文件存储在服务器指定的磁盘目录中image.transferTo(new File("D:\\downloadFile\\" + newName));return Result.success();}}
      

使用postman重新发送相同的请求,运行结果如下:

 

问题成功解决 

在SpringBoot中,文件上传,默认单个文件允许最大大小为1M,如果需要上传大文件,可以进行如下配置

小结 

  • String getOriginalFilename() -->获取原始文件名
  • void transferTo(File dest)-->将接受文件转存到磁盘文件中
  • long getSize() -->获取文件大小,单位字节(byte) 1KB=1024字节
  • byte[ ] getBytes() --> 获取文件内容的字节数组
  • InputStream getInputStream() -->获取接收到的文件内容的输入流

阿里云OSS

阿里云

  • 阿里云是阿里巴巴集团旗下全球领先的云计算公司,也是国内最大的云服务提供商

阿里云OSS

  • 阿里云对象存储OSS(Object Storage Service ),是一款海量、安全、低成本、高可靠的云存储服务。使用OSS,可以通过网路随时存储和调用包括文本、图片、音频和视频等在内的各种文件。

使用第三方服务--通用思路

 准备工作

参照官方SDK代码,编写入门程序

  • SDK是软件开发工具包(Software Development Kit)的缩写,它是一组用于开发特定软件应用或平台的工具、库和文档的集合。SDK提供了开发者所需的工具和资源,以便他们能够更轻松地创建、测试和部署软件应用。SDK通常包含编译器、调试器、API文档、示例代码和其他开发工具,以及与特定平台或操作系统交互的库和组件。开发者可以使用SDK来构建应用程序、插件、扩展或其他软件组件,以便与特定的软件、硬件或服务进行集成。

集成使用

阿里云OSS-使用步骤

阿里云OSS使用步骤

注册阿里云---充值(选做)---开通对象存储服务(OSS)---创建bucket---获取AccessKey(密钥)---参照官方SDK编写入门使用----案例集成OSS

  • Bucket:存储空间是用户用于存储对象(object,就是文件)的容器,所有对象都必须隶属于某个存储空间

具体使用步骤参照一下文件:

【腾讯文档】SpringBoot案例所需文档
https://docs.qq.com/doc/DUkRiTWVaUmFVck9N

参照SDK编写入门程序

根据阿里云官方提供的文档进行操作即可

  • 首先安装Java JDK
  • 然后进行需要进行的OSS操作 

     复制对应的代码即可,根据自己的信息修改其中的具体代码

我要使用文件上传的功能,具体代码如下:

package com.example.tlias;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;import java.io.FileInputStream;
import java.io.InputStream;public class Demo {public static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。// todo 指定OSS服务地址String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// todo 设置访问凭证// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称,例如examplebucket。// todo 指定文件所存储的bucket名字(bucketName),以及文件的名称(objectName)String bucketName = "examplebucket";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "exampledir/exampleobject.txt";// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。// todo 指定本地要上传的文件String filePath = "D:\\localpath\\examplefile.txt";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);try {InputStream inputStream = new FileInputStream(filePath);// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}
} 

修改完具体的参数之后,允许一下该java程序,允许结果如下:

运行成功 

 并且会为每一个文件设置一个访问的url地址

案例集成OSS (文件上传接口的实现)

 在员工案例中的对于新增员工接口功能的实现中,还没有实现对于员工头像信息的上传,头像上传功能的实现,参照接口文档中的文件上传接口,接口文档的具体链接如下:

https://hkm-web.oss-cn-beijing.aliyuncs.com/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3

 引入阿里云OSS工具类

package com.example.tlias.utils;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.util.UUID;/*** 阿里云 OSS 工具类*/
@Component
public class AliOSSUtils {// todo 指定OSS服务地址private String endpoint = "你自己的";// todo 设置密钥账号和密码private String accessKeyId = "你自己的";private String accessKeySecret = "你自己的";// todo 设置文件存储buketprivate String bucketName = "你自己的";/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}}

控制类

package com.example.tlias.controller;import com.example.tlias.pojo.Result;
import com.example.tlias.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
@Slf4jpublic class UpLoadController {// todo 文件存储到本地
//    @PostMapping("/upload")
//    public Result upload(String username, Integer age, MultipartFile image) throws IOException {
//        log.info("文件上传,name:{},age:{},image:{}", username, age, image);
//        //  todo 获取原始文件名,但是不同文件的原始文件名可能相同
//        String name = image.getOriginalFilename();
//        // todo 构造唯一文件名--uuid(通用唯一识别码)
//        // 获取文件后缀名
//        int index = name.lastIndexOf(".");//获取最后的.的索引位置
//        String extname = name.substring(index);//进行截取
//        String newName = UUID.randomUUID().toString() + extname;//创建唯一文件名
//        log.info("获取到的新的文件名为:{}", newName);
//        //  todo 将文件存储在服务器指定的磁盘目录中
//        image.transferTo(new File("D:\\downloadFile\\" + newName));
//        return Result.success();
//    }
// todo 文件存储至阿里云OSS@Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public Result upload(MultipartFile image) throws IOException {log.info("文件上传至阿里云,文件名:{}", image.getOriginalFilename());// 调用阿里云OSS工具进行文件上传String url = aliOSSUtils.upload(image);log.info("文件上传完成,文件url地址为:{}", url);return Result.success(url);}
}

测试 

前后端联调 

 

运行成功  

小结

文件上传介绍

前端页面三要素(file表单项、post方法、multipart/form-data)

服务端接口接收文件(Multipart)

文件存储方式

  • 本地存储(无法直接访问、磁盘空间受限、磁盘损坏)
  • 云存储OSS

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

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

相关文章

深层次分析字符数组和字符串的区别是什么?

前言 (1)休闲时刻刷B站,看到一个卖课的,发视频问,char arr1[]{‘H’,‘E’,‘L’,‘L’,‘O’};和char arr2[]“HELLO”;区别是什么。 (2)看那个卖课博主一顿分析,最后成功得出&…

IT运维:使用数据分析平台监控DELL服务器

概述 在企业日常运维中,我们有着大量的服务器设备,设备故障一般可以通过常用的监控软件实现自动告警,但如果在管理运维中我们要做的不仅仅是发现故障,处理硬件故障,我们还需要进一步的了解,今年一共出现了多…

nodejs+vue+elementui农业产品信息网上商城管理系统_9927h

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementui,系统使用权限分别包括管理员、种植户和用户,其中管理员拥有着最大的权限,同时管理员的…

MySQL数据库 索引、事务、储存引擎

索引 索引的概念 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找…

【智算中心】GPU是如何改变世界的

现在有市场消息表示,NVIDIA正计划减少A800 GPU的产量,以促进其更高端的H800 GPU 的销售。很显然NVIDIA是希望从H800 GPU上获得更多销售量,从中国市场获得更多利益。而且最近一段时间有传闻美国要彻底封杀AI芯片的出口,让国内甚至连…

【java】LinkedList 和 ArrayList的简介与对比

Java LinkedList和 ArrayList 在使用上,几乎是一样的。由于LinkedList是基于双向链表的,会多出list.getFirst();获取头部元素等方法 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按…

掌握指针和数组:经典笔试题攻略(万字详解)

🍁博客主页:江池俊的博客 💫收录专栏:C语言刷题专栏 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐ 文章目录 前…

电脑显示“Operating System not found”该怎么办?

“Operating System not found”是一种常见的电脑错误提示,这类错误会导致你无法成功启动Windows。那么电脑显示“Operating System not found”该怎么办呢? 方法1. 检查硬盘 首先,您可以测试硬盘是否存在问题。为此,您可以采取以…

基于JSP+Servlet+Mysql停车场管理系统(含实训报告)

TOC 一、系统介绍 项目类型:Java web项目 项目名称:基于JSPServlet的停车场管理系统 项目架构:B/S架构 开发语言:Java语言 前端技术:HTML、CSS、JS、JQuery等技术 后端技术:JSP、Servlet、JDBC等技术…

Python案例|Matplotlib库实现的数据分析

数据展示是数据分析和挖掘中的重要环节,通过图形的形式可以直观、清晰地呈现数据内在的规律。 本文所用数据采用上一篇案例实现后的数据表,数据存储在newbj_lianJia.csv文件中,具体代码如下。 import pandas as pd #导入库 import matplot…

自定义拖拽功能,上下拖拽改变盒子高度

核心在于监听鼠标的move来改变div的高度&#xff0c;抽成了组件 <template><div ref"container" class"drag"><z-tooltip v-if"isShowIcon" effect"dark" content"格式化" placement"top-start"&…

视频分割合并工具说明

使用说明书&#xff1a;视频分割合并工具 欢迎使用视频生成工具&#xff01;本工具旨在帮助您将视频文件按照指定的规则分割并合并&#xff0c;以生成您所需的视频。 本程序还自带提高分辨率1920:1080&#xff0c;以及增加10db声音的功能 软件下载地址 https://github.com/c…

树模型与集成学习:LightGBM

目录 树模型与集成学习 LightGBM 的贡献 LightGBM 的贡献&#xff1a;单边梯度抽样算法 LightGBM 的贡献&#xff1a;直方图算法 LightGBM 的贡献&#xff1a;互斥特征捆绑算法 LightGBM 的贡献&#xff1a;深度限制的 Leaf-wise 算法 树模型与集成学习 树模型是非常好的…

Windows系统下,将文件夹中文件名字全部复制提取出来

一、使用命令提示符&#xff08;Command Prompt&#xff09;&#xff1a; 1、打开文件夹&#xff0c;确保你所需的文件都在该文件夹中。 2、在文件夹的路径栏中&#xff0c;输入 “cmd” 并按下 Enter 键&#xff0c;以打开命令提示符并将其当前路径设置为所选文件夹的路径。 …

Java——一个简单的使用JPanel和JButton来设计窗口界面

这段代码是一个简单的使用JPanel和JButton来设计窗口界面的例子。 在designFrame方法中&#xff0c;创建了一个JFrame对象作为窗口&#xff0c;然后创建了两个JPanel对象作为面板&#xff0c;分别用于放置按钮。 创建了两个JButton对象作为按钮&#xff0c;并设置按钮的文本内容…

AI 时代,程序员无需焦虑 | 《服务端开发:技术、方法与实用解决方案》(文末送书福利4.0)

文章目录 &#x1f4cb;前言&#x1f3af;程序员会被 AI 取代么&#xff1f;&#x1f3af;服务端开发尚难被 AI 取代&#x1f3af; 服务端开发何去何从&#xff1f;&#x1f3af;业界首部体系化、全景式解读服务端开发的著作&#x1f4ac;读者对象&#x1f4da;本书优势&#x…

k-近邻算法概述,k-means与k-NN的区别对比

目录 k-近邻算法概述 k-近邻算法细节 k值的选取 分类器的决策 k-means与k-NN的区别对比 k-近邻算法概述 k近邻&#xff08;k-nearest neighbor, k-NN&#xff09;算法由 Cover 和 Hart 于1968年提出&#xff0c;是一种简单的分类方法。通俗来说&#xff0c;就是给定一个…

3D角色展示

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>3D卡片悬停</title><style>font-face {font-family: "Exoct";src: url("htt…

centos7设置java后端项目开机自启【脚本、开机自启】

1.切换目录 cd /etc/init.d/2.编辑脚本 vim wbs-service-start.sh编辑内容 #!/bin/bash # chkconfig: 2345 80 90 # description: auto_runnohup java -jar /usr/java/wbs-service.jar > /dev/null 2>&1 & echo $! > /var/run/wbs-service.pid3.添加进入系…

Hugo·Stack主题·杂记

运行环境 hugo版本&#xff1a;v0.117.0&#xff08;扩展版&#xff09; go&#xff1a;1.21.0 PowerShell 7&#xff08;x64&#xff09; Windows10 添加主题 git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack修改配置文件 m…