当前位置: 首页 > news >正文

[java后端研发]——文件上传与下载(2种方式)

🌈键盘敲烂,年薪30万🌈

目录

一、本地存储:

二、云存储(阿里云OSS):

📕总结


前言:

文件上传在后端开发中经常用到,例如显示一张图片,就需要我们后端保存图片文件,然后将图片文件回显给浏览器。

  • 对于图片文件来说就俩个步骤:

1. 接收上传的图片保存起来 ->本地 或 云服务器

2. 回显图片给浏览器 -> 返回本地文件路径 或 云服务器的文件路径

  • 服务器处理图片的两种方式:

①保存在服务器本地的磁盘中

②交给云服务器存储,例如阿里云OSS

  • 注意:

每次请求时,服务器会将文件临时保存在一个地方,请求结束时,临时文件会被删除,所以才要把上传的文件下载到本地或云端。

  • 认识MultipartFile类:

spring框架封装好了用于前后端传输文件的类 -> MultipartFile,前端页面必须有一个type为MultipartFile的From表单,当前端发送请求到后端时,我们后端只需用一个MultipartFile类的对象就可以接收这个文件参数。下面就说一下两种文件存储方式。

一、本地存储:

①文件上传到本地:

注意:

保存的路径可以在配置文件里设置

保存的文件名要用UUID生成,防止文件覆盖

    //保存到本地@PostMapping("/upload")public R<String> upload(MultipartFile file) throws Exception {//要保存的路径String basePath = "D:\\image";//file是一个临时文件,当请求结束时,临时文件会删除// 先判断转存路径的文件夹有没有File dir = new File(basePath);if(!dir.exists()){dir.mkdirs();}//这里有两个地方要改//1.文件路径要写在配置文件里面//2.文件名要用UUID生成// 获取源文件名 xxxx.jpgString originalFilename = file.getOriginalFilename();// 获取后缀 .jpgString suffix = originalFilename.substring(originalFilename.lastIndexOf("."));// 使用UUID重新生成文件名String fileName = UUID.randomUUID().toString() + suffix;file.transferTo(new File(basePath + fileName));return R.success(fileName);}

②文件下载到浏览器:

注意:

用输出流从服务器本地向浏览器输出数据

        //文件下载到浏览器@GetMapping("/download")public void download(String name, HttpServletResponse response) throws IOException {//从服务器读取文件BufferedInputStream bis = new BufferedInputStream(new FileInputStream(basePath + name));BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());response.setContentType("image/jpeg");int len = 0;byte[] bytes = new byte[1204];while( (len = bis.read(bytes)) != -1 ){bos.write(bytes, 0, len);bos.flush();}bos.close();bis.close();}

二、云存储(阿里云OSS):

①文件上传到阿里云:

注意:

需要导入阿里OSS的相关包,使用putObject方法以流的方式写道云服务器。

    public String upload(MultipartFile file) throws IOException, ClientException {String endpoint = propertiesUtils.getEndpoint();String bucketName = propertiesUtils.getBucketName();// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider=CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = "https://" + bucketName + "." + endpoint + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}

②将阿里云的图片路径返回给数据库:

存储到阿里云中的图片直接赋值路径从浏览器就能打开,所以直接在数据库中创建一个字段存储图片的url即可回显图片。

📕总结

  • 本地存储不安全,数据一旦丢失,维护成本高。通过transerForTo方法转存到本地服务器。
  • 云存储通过阿里OSS工具类提供的putObject方法,将文件保存到阿里云OSS服务器。

相关文章:

  • 代码随想录算法训练营Day 49 || 123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV
  • 49.批处理命令(1/2)
  • 《Redis实战》笔记
  • 企业计算机中了mkp勒索病毒怎么办,服务器中了勒索病毒如何处理
  • tomcat下载与使用教程
  • 每日一题(LeetCode)----数组--移除元素(五)
  • 无人驾驶智能:两车居然可以“交流”
  • 原型制作神器ProtoPie的使用Unity与网页跨端交互
  • 【开源】基于Vue.js的智能停车场管理系统的设计和实现
  • K8S篇之k8s containerd模式fail to pull image certificate signed by unknown authority
  • 基于springboot实现致远汽车租赁平台管理系统项目【项目源码+论文说明】
  • 多状态Dp问题——买卖股票的最佳时机含冷冻期
  • 黑窗口连接远程服务
  • 苹果转移供应链,促中国手机和中国制造更紧密合作,加速技术升级
  • CCNA课程实验-13-PPPoE
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • co.js - 让异步代码同步化
  • CSS实用技巧干货
  • flask接收请求并推入栈
  • node学习系列之简单文件上传
  • Python连接Oracle
  • Python中eval与exec的使用及区别
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Solarized Scheme
  • win10下安装mysql5.7
  • yii2中session跨域名的问题
  • Zsh 开发指南(第十四篇 文件读写)
  • 和 || 运算
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 力扣(LeetCode)21
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • ​力扣解法汇总946-验证栈序列
  • # Maven错误Error executing Maven
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (ibm)Java 语言的 XPath API
  • (八)Flask之app.route装饰器函数的参数
  • (独孤九剑)--文件系统
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (黑马C++)L06 重载与继承
  • (一)SpringBoot3---尚硅谷总结
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ***测试-HTTP方法
  • .bat批处理(六):替换字符串中匹配的子串
  • .gitattributes 文件
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net Web窗口页属性
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @ModelAttribute 注解
  • @selector(..)警告提示
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序