文件的上传(图片、PDF、视频)

news/2025/2/19 14:49:51/

提示:本文仅记录本人工作中遇到的难点与个人见解,仅供参考,如有问题请见谅。

目录

前言

一、创建UploadUtil工具类

二、需要在yml中定义上传到系统的路径

三、创建UploadControlle


前言

文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,以供用户预览或下载。


一、创建UploadUtil工具类

 代码如下:

import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.CommonUtils;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.File;/*** 该类处理文件的上传(图片、PDF、视频)*/
@Slf4j
public class UploadUtil {/*** Web端上传文件工具类:返回图片、文件、视频的保存路径* @param multipartFile 文件* @param path 保存路径(图片、电子书、视频的保存路径是不一致的)* @param kind 上传文件的种类;图片填"images",pdf填"pdf",视频填"video"*/public static String upload(MultipartFile multipartFile, String path, String kind) {try {// 先创建文件夹,例如 E://upload//images或者/opt/yhs/imagesFile file = new File(path + File.separator);if (!file.exists()) {file.mkdirs();}// 文件原始名(包括后缀);例如123456.txtString orgName = multipartFile.getOriginalFilename();// 不包括后缀的文件名;例如123456String preName = orgName.substring(0, orgName.lastIndexOf("."));// 如果文件名太长,则只截取文件名前15位字符+后缀,再拼接时间戳进行返回并保存if (preName.length() > 15) {orgName = preName.substring(0, 15) + orgName.substring(orgName.lastIndexOf("."));}// 判断文件名是否带盘符并重新处理orgName = CommonUtils.getFileName(orgName);// 生成的新文件名String fileName;if (orgName.contains(".")) {// 示例:test.123456.png,经过处理后得到:test.123456_1661136943533.pngfileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));} else {// 文件名中没有"."说明这不是一个正常的文件return "";}// 将用户上传的文件复制到指定目录String savePath = file.getPath() + File.separator + fileName;File saveFile = new File(savePath);FileCopyUtils.copy(multipartFile.getBytes(), saveFile);// 返回给前端的具体完整地址String dbPath = "";// 获取系统类型(Win和Linux返回的路径是不一样的)String osName = System.getProperty("os.name");if (osName.startsWith("Windows")) {// 这是windows系统上的保存路径switch (kind) {case "images":dbPath = "/upload/images" + File.separator + fileName;break;case "pdf":dbPath = "/upload/pdf" + File.separator + fileName;break;default:dbPath = "/upload/video" + File.separator + fileName;}} else if (osName.startsWith("Linux")) {// 这是linux系统上的保存路径dbPath = file.getPath() + File.separator + fileName;}if (dbPath.contains("\\")) {dbPath = dbPath.replace("\\", "/");}// 返回完整目录+文件名,例如/upload/images/aaa.png或者/opt/yhs/images/aaa.png;前端根据项目具体地址拼接即可return dbPath;} catch (Exception e) {log.error(e.getMessage(), e);}return "";}
}

二、需要在yml中定义上传到系统的路径

# 图片保存路径(不管什么图片,全都保存在该目录)
images: E://upload//images
# pdf保存路径
pdf: E://upload//pdf
# 视频保存路径(不管什么视频,全部保存在该目录)
video: E://upload//video

三、创建UploadController

 代码如下:

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.util.UploadUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;@Slf4j
@Api(tags = "文件上传和下载")
@RestController
@RequestMapping("/upload")
public class UploadController {@Value(value = "${jeecg.path.video}")private String videoPath;@Value(value = "${jeecg.path.images}")private String imagesPath;@Value(value = "${jeecg.path.pdf}")private String pdfPath;/*** 图片上传*/@ApiOperation(value = "上传图片接口", notes = "上传图片接口")@RequestMapping(value = "/uploadImage", method = RequestMethod.POST)public Result<String> uploadImage(MultipartFile file) {Result<String> result = new Result<>();// 图片保存到本地String savePath = UploadUtil.upload(file, imagesPath, "images");if (oConvertUtils.isNotEmpty(savePath)) {result.setResult(savePath);result.setSuccess(true);} else {result.setMessage("上传失败,请稍后再试!");result.setSuccess(false);}return result;}/*** 视频上传(一次上传单个视频)*/@ApiOperation(value = "上传视频接口", notes = "上传视频接口")@RequestMapping(value = "/uploadVideo", method = RequestMethod.POST)public Result<String> uploadVideo(MultipartFile file) {Result<String> result = new Result<>();// 视频保存到本地String savePath = UploadUtil.upload(file, videoPath, "video");if (oConvertUtils.isNotEmpty(savePath)) {result.setResult(savePath);result.setSuccess(true);} else {result.setMessage("上传失败,请稍后再试!");result.setSuccess(false);}return result;}/*** pdf或视频下载统一接口* @param path 文件保存路径* @param response 文件流*/@ApiOperation(value = "下载文件(视频或pdf)", notes = "下载文件")@RequestMapping(value = "/downloadFile", method = RequestMethod.GET)public Result<String> download(@RequestParam(name = "path") String path, HttpServletResponse response) {Result<String> result = new Result<>();if (oConvertUtils.isEmpty(path) || path.equals("null")) {result.setMessage("下载失败,未找到对应文件!");result.setSuccess(false);return result;}InputStream inputStream = null;OutputStream outputStream = null;// 获取文件名String fileName = path.substring(path.lastIndexOf("/") + 1);// 拼接出文件的完整路径String string = bookPath + File.separator + fileName;try {string = string.replace("..", "");if (string.endsWith(",")) {string = string.substring(0, string.length() - 1);}File file = new File(string);if (!file.exists()) {result.setMessage("下载失败,文件不存在!");result.setSuccess(false);return result;}// 设置强制下载不打开(下面这行代码会导致异常,所以暂时注释)// response.setContentType("application/force-download");// 设置content-disposition响应头控制浏览器以下载的形式打开文件response.addHeader("Content-Disposition", "attachment; fileName=" + URLEncoder.encode(fileName, "UTF-8"));// 获取要下载的文件输入流inputStream = new BufferedInputStream(new FileInputStream(file));// 通过response对象获取OutputStream流outputStream = response.getOutputStream();// 获取文件长度,前端就可得到下载进度response.setContentLength((int) file.length());int length;// 创建数据缓冲区byte[] buf = new byte[1024];while ((length = inputStream.read(buf)) != -1) {outputStream.write(buf, 0, length);}response.flushBuffer();result.setMessage("下载成功!");result.setSuccess(true);} catch (Exception e) {log.error(e.getMessage(), e);result.setMessage("下载失败!");result.setSuccess(false);} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {log.error(e.getMessage(), e);}}if (outputStream != null) {try {outputStream.close();} catch (IOException e) {log.error(e.getMessage(), e);}}}return result;}}


http://www.ppmy.cn/news/597237.html

相关文章

网络安全——文件上传

1.文件 动态文件&#xff1a;具有交互性的文件 格式&#xff1a;.py .php 等与代码相关的文件&#xff0c;与后台进行交互 静态文件&#xff1a;不具有交互性的文件 格式&#xff1a;.jpg .txt .mp3&#xff08;二进制流通过播放器所呈现的效果&#xff09;.html&#xff0…

Linux 镜像文件ISO下载地址、centos网络配置:

Linux 镜像文件ISO下载地址: 国外: Index of /centos-vault/6.1/isos/x86_64/ 国内阿里下载: centos安装包下载_开源镜像站-阿里云 (aliyun.com)https://mirrors.aliyun.com/centos/?spm=a2c6h.13651104.0.0.440a320cBKbdJi centos下载列表: 国外下载: http://is…

nginx+ftp实现图片的上传与访问

根据项目的开发要求&#xff0c;使用ftp实现上传图片&#xff0c;通过nginx搭建图片服务器&#xff0c;即对nginx的简单功能的一种应用。 关于vsftp和nginx的安装就不在这里详细演示&#xff0c;下面的代码是关于nginx.conf的配置&#xff0c;即将ftp上传的图片路径映射到nginx…

上传文件的加密和下载文件解密

文件上传加密 在很多应用场景中&#xff0c;出于安全考虑&#xff0c;我们不得不实行上传文件时对文件进行加密&#xff0c; 存入服务器的文件就会变成二进制文件&#xff0c;当别人直接冲服务器拿到文件时&#xff0c;也无法查看&#xff0c;这就保证了安全性。 但是我们需要…

从茄子网看,一项改进能够带来网络相册的全新世界

从茄子网看&#xff0c;一项改进能够带来网络相册的全新世界 一、早期的相册 二、网民的需求 三、茄子网几个有意思的特点 四、同步翻阅功能的商业价值 五、茄子网和利基战略 分析案例&#xff1a;茄子网([url]www.qiezi.com)[/url]、网易相册、Yahoo相册、TOM相册 一、早期的相…

移动端上传图片和视频文件

手机拍摄的视频文件一般是mp4格式的&#xff0c;ios系统拍摄的视频是mov格式 上传图片功能是直接调用的摄像头&#xff0c;并且可以选择本地图片 大概页面设计如下&#xff1a; 具体实现功能&#xff1a; 1、可以调用摄像头上传图片 2、上传本地视频 3、预览已上传的图片和…

Haystack:Facebook 的照片存储系统

目录 1. 简介 2. 背景和之前的设计 3. 设计和实施 4. 评估 5. 相关工作 6. 结论 Haystack&#xff1a;Facebook 的照片存储 摘要&#xff1a;本文描述了 Haystack&#xff0c;一个为 Facebook 的照片应用程序提供优化的对象存储系统。Facebook 目前存储了超过 2600 亿张图像&a…

新浪BLOG上传图片的方法

一、你见过这个发表文章的地方吧&#xff0d;&#xff0d;这是头&#xff0c;我们要找的是尾 二、这就是尾&#xff0c;我们要找的是左下角这个“图片剪切板”&#xff01; 三、点击标题“图片剪切板”就出现很多插入图片的框框&#xff0c;看下面 四、按下“浏览”按钮&#x…