SpringBoot2:web开发常用功能实现及原理解析-上传与下载

server/2024/11/14 12:37:17/

文章目录

  • 一、上传文件
    • 1、前端上传文件给Java接口
    • 2、Java接口上传文件给Java接口
  • 二、下载文件
    • 1、前端调用Java接口下载文件
    • 2、Java接口下载网络文件到本地
    • 3、前端调用Java接口下载网络文件

一、上传文件

1、前端上传文件给Java接口

Controller接口
此接口支持上传单个文件和多个文件,并保存在本地


import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;/*** 文件上传测试*/
@Slf4j
@RestController
public class FileTestController {/*** MultipartFile 自动封装上传过来的文件* @param headerImg* @param photos* @return*/@PostMapping("/upload")public String upload(@RequestPart("headerImg") MultipartFile headerImg,@RequestPart("photos") MultipartFile[] photos) throws IOException {log.info("上传的信息:headerImg={},photos={}",headerImg.getSize(),photos.length);if(!headerImg.isEmpty()){//保存到文件服务器,OSS服务器String originalFilename = headerImg.getOriginalFilename();headerImg.transferTo(new File("E:\\workspace\\boot-05-web-01\\headerImg\\"+originalFilename));}if(photos.length > 0){for (MultipartFile photo : photos) {if(!photo.isEmpty()){String originalFilename = photo.getOriginalFilename();photo.transferTo(new File("E:\\workspace\\boot-05-web-01\\photos\\"+originalFilename));}}}return "OK";}}

yaml配置

spring:servlet:multipart:max-file-size: 10MB		单个文件最大值max-request-size: 100MB	单次请求上传文件最大值file-size-threshold: 4KB	内存中IO流,满4KB就开始写入磁盘

Postman调用传参
在这里插入图片描述

2、Java接口上传文件给Java接口

我这里是将前端接收过来的文件转发到另外一个接口,也就是一种上传操作。
如果,你要将本地文件上传过去,那么,修改下代码,读取本地文件,格式转化一下即可。

RestTemplateConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}}

Java转发文件接口

	@PostMapping("/upload")public String upload(@RequestPart("headerImg") MultipartFile headerImg,@RequestPart("photos") MultipartFile[] photos) throws IOException {log.info("上传的信息:headerImg={},photos={}",headerImg.getSize(),photos.length);String url="http://127.0.0.1:8080//upload2";//封装请求头HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.set("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE + ";charset=UTF-8");httpHeaders.set("test1", "1");httpHeaders.set("test2", "2");MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();//文件处理FileSystemResource headerImgFile = new FileSystemResource(multipartFile2File(headerImg));form.add("headerImg", headerImgFile);FileSystemResource[] photosArr = new FileSystemResource[photos.length];for (int i = 0; i < photos.length; i++) {photosArr[i] = new FileSystemResource(multipartFile2File(photos[i]));form.add("photos", photosArr[i]);}HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, httpHeaders);RestTemplate restTemplate = new RestTemplate();//发送请求String result = restTemplate.postForObject(url, files,String.class);return result;}private static File multipartFile2File(@NonNull MultipartFile multipartFile) {// 获取文件名String fileName = multipartFile.getOriginalFilename();// 获取文件前缀String prefix = fileName.substring(0, fileName.lastIndexOf("."));//获取文件后缀String suffix = fileName.substring(fileName.lastIndexOf("."));try {//生成临时文件//文件名字必须大于3,否则报错File file = File.createTempFile(prefix, suffix);//将原文件转换成新建的临时文件multipartFile.transferTo(file);file.deleteOnExit();return file;} catch (Exception e) {e.printStackTrace();}return null;}

Java接收文件接口

	@PostMapping("/upload2")public String upload2(@RequestPart("headerImg") MultipartFile headerImg,@RequestPart("photos") MultipartFile[] photos) throws IOException {if(!headerImg.isEmpty()){//保存到文件服务器,OSS服务器String originalFilename = headerImg.getOriginalFilename();headerImg.transferTo(new File("E:\\workspace\\boot-05-web-01\\headerImg\\"+originalFilename));}if(photos.length > 0){for (MultipartFile photo : photos) {if(!photo.isEmpty()){String originalFilename = photo.getOriginalFilename();photo.transferTo(new File("E:\\workspace\\boot-05-web-01\\photos\\"+originalFilename));}}}return "upload2 OK";}

二、下载文件

1、前端调用Java接口下载文件

Controller

import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;@Slf4j
@RestController
public class FileTestController {private static final String FILE_DIRECTORY = "E:\\workspace\\boot-05-web-01\\photos";@GetMapping("/files/{fileName:.+}")public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) throws IOException {Path filePath = Paths.get(FILE_DIRECTORY).resolve(fileName).normalize();Resource resource = new FileUrlResource(String.valueOf(filePath));if (!resource.exists()) {throw new FileNotFoundException("File not found " + fileName);}// 设置下载文件的响应头HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"");return ResponseEntity.ok().headers(headers).body(resource);}}

测试方法:
浏览器直接发送get请求即可
http://127.0.0.1:8080/files/andriod1749898216865912222.jpg

2、Java接口下载网络文件到本地

Controller

	@GetMapping("/downloadNetFileToLocal")public Object downloadNetFileToLocal(@RequestParam("url") String fileUrl) throws Exception {JSONObject result = new JSONObject();String fileName = fileUrl.split("/")[fileUrl.split("/").length-1];URL url = new URL(fileUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);InputStream inputStream = connection.getInputStream();FileOutputStream fileOutputStream = new FileOutputStream("E:\\workspace\\boot-05-web-01\\photos\\"+fileName);byte[] buffer = new byte[1024];int byteread;int bytesum = 0;while ((byteread = inputStream.read(buffer)) != -1){bytesum += byteread;fileOutputStream.write(buffer,0,byteread);}fileOutputStream.close();result.put("bytes",bytesum);result.put("code",200);return result.toString();}

测试地址:
http://127.0.0.1:8080/downloadNetFileToLocal?url=https://img-blog.csdnimg.cn/166e183e84094c44bbc8ad66500cef5b.jpeg

3、前端调用Java接口下载网络文件

	@GetMapping("/downloadNetFile")public ResponseEntity<?> downloadNetFile(@RequestParam("url") String fileUrl) throws Exception {String fileName = fileUrl.split("/")[fileUrl.split("/").length-1];URL url = new URL(fileUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);InputStream inputStream = connection.getInputStream();byte[] bytes = streamToByteArray(inputStream);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setContentLength(bytes.length);headers.setContentDispositionFormData("attachment", fileName);return new ResponseEntity<>(bytes, headers, HttpStatus.OK);}/*** 功能:将输入流转换成 byte[]** @param is* @return* @throws Exception*/public static byte[] streamToByteArray(InputStream is) throws Exception {ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象byte[] b = new byte[1024];int len;while ((len = is.read(b)) != -1) {bos.write(b, 0, len);}byte[] array = bos.toByteArray();bos.close();return array;}

测试地址:http://127.0.0.1:8080/downloadNetFile?url=https://img-blog.csdnimg.cn/166e183e84094c44bbc8ad66500cef5b.jpeg


http://www.ppmy.cn/server/119191.html

相关文章

CSS传统布局方法(补充)——WEB开发系列37

开发技术不断演进&#xff0c;布局方式也经历了多个阶段的变革。从最初的基于表格布局到 CSS 的浮动布局&#xff0c;再到今天的弹性盒&#xff08;Flexbox&#xff09;与 CSS Grid 网格布局&#xff0c;每一种布局方式都有其独特的背景和解决特定问题的优势。 一、CSS Grid 出…

详解x86汇编指令:test edx, edx

前言 有不少新手在学习汇编指令的时候可能会被网上一些人误导&#xff08;很显然我就被误导了&#xff09;&#xff0c;认为test与cmp指令相同&#xff0c;都是在比较两个值是否相同的&#xff0c;那么来看这两个指令&#xff1a; test edx,edx jne 0040BCA3jne 指令为不等于0…

应用层协议——http

目录 http 介绍 urlencode / urldecode http 请求与响应格式 1 请求 2 响应 http 状态码 长连接 会话保持 调试 http 的一些基本工具 telnet postman fidller http 介绍 针对常见场景&#xff0c;早已有大佬们写好了对应的协议&#xff0c;最典型的就是 http 和 ht…

Prometheus 上手指南

文章目录 Prometheus 相关概念Prometheus 的特点Prometheus 架构数据模型 Datemode使用场景 指标类型 Metric type适用场景 作业和实例 Jobs and instances使用场景 Prometheus 安装Prometheus 配置prometheusalertmanager Grafana 可视化Grafana 安装Grafana 配置选项Grafana …

(SERIES12)DM性能优化

1 前言 1.1 性能优化的概念 性能优化是指在不影响系统运行正确性的前提下&#xff0c;使之运行地更快&#xff0c;完成特定功能所需的时间更短。达梦数据库性能优化主要包含以下内容&#xff1a; 数据库架构优化数据库参数优化SQL 优化统计信息 1.2 工具与术语 数据库性能优…

Element走马灯组件循环播放两个页面是方向不一致

摘要&#xff1a;使用Carousel 走马灯循环播放同一类型的图片、文字等内容&#xff0c;会在循环内容为两组是出现下图 [1]中的现象。本文记录下如何解决 之前项目遇到过一次这个问题&#xff0c;由于indicator-position 指示器不用显示&#xff0c;则判断内容长度为2时&#xf…

PHP省时省力海报在线制作系统小程序源码

省时省力海报在线制作系统&#xff1a;设计小白也能秒变大师 &#x1f3a8; 开篇&#xff1a;告别繁琐&#xff0c;拥抱高效设计 你还在为设计一张海报而熬夜加班吗&#xff1f;还在为找不到合适的素材而焦头烂额吗&#xff1f;别担心&#xff0c;“省时省力海报在线制作系统”…

道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路

道路裂缝&#xff0c;坑洼&#xff0c;病害数据集 包括无人机视角&#xff0c;摩托车视角&#xff0c;车辆视角 覆盖道路所有问题 一共有八类16000张 1到7依次为: [横向裂缝, 纵向裂缝, 块状裂缝, 龟裂, 坑槽, 修补网状裂缝, 修补裂缝, 修补坑槽] 道路病害&#xff08;如裂缝、…