“文件的上传与下载:实现与优化“

简介: “文件的上传与下载:实现与优化“

引言

在开发过程中,文件的上传与下载是常见的需求。本篇博客将以CSND为例,介绍文件上传与下载的常见方式,以及如何通过优化提升性能和用户体验。

1.文件的上传

  1. 使用表单提交方式
<%--
  Created by IntelliJ IDEA.
  User: yuanh
  Date: 2023/9/9
  Time: 16:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/student/upload" method="post" enctype="multipart/form-data">
    <label>编号:</label><input type="text" name="sid" readonly="readonly" value="${param.sid}"/><br/>
    <label>图片:</label><input type="file" name="photo"/><br/>
    <input type="submit" value="上传图片"/>
</form>
</body>
</html>
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
  1. 文件上传
@RequestMapping("/upload")
    public String upload(Student student,MultipartFile photo){
        try {
            //        D:\Course\temp\images
            String dir = PropertiesUtil.getValue("dir");
            String server = PropertiesUtil.getValue("server");
            String originalFilename = photo.getOriginalFilename();
            FileUtils.copyInputStreamToFile(photo.getInputStream(),new File(dir+originalFilename));
            student.setSname(server+originalFilename);
            studentBiz.updateByPrimaryKeySelective(student);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
  1. resource.properties 配置
dir= D:/Course/temp/images/
server=/images/
• 1
• 2

2.文件的下载

  1. 常规下载方式
    提供直接下载链接,用户点击链接即可下载文件。
    设置合适的下载文件名和MIME类型。
    控制权限,只允许有权限的用户下载。
  2. 异步下载
@RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(Student student, HttpServletRequest req){
        try {
            //先根据文件id查询对应图片信息
            Student stu = this.studentBiz.selectByPrimaryKey(student.getSid());
            String diskPath = PropertiesUtil.getValue("dir");
            String reqPath = PropertiesUtil.getValue("server");
            String realPath = stu.getSname().replace(reqPath,diskPath);
            String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
            //下载关键代码
            File file=new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20
• 21
• 22
• 23

JRebel是一个Java开发工具,可以实时更新Java代码而无需重新启动应用程序。

  • 1.安装JRebel插件

  • 2.打开代理ReverseProxy_windows_amd64.exe(顺序不能错)

  • 3.启动JRebel,测试使用
  • 4.设置jrebel离线

4. 文件批量上传

批量下载图片可以通过以下方式实现:

@RequestMapping("/uploads")
    public String uploads(HttpServletRequest req, Student student, MultipartFile[] files){
        try {
            StringBuffer sb = new StringBuffer();
            for (MultipartFile cfile : files) {
                //思路:
                //1) 将上传图片保存到服务器中的指定位置
                String dir = PropertiesUtil.getValue("dir");
                String server = PropertiesUtil.getValue("server");
                String filename = cfile.getOriginalFilename();
                FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
                sb.append(filename).append(",");
            }
            System.out.println(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }
• 1
• 2
• 3
• 4
• 5
• 6
• 7
• 8
• 9
• 10
• 11
• 12
• 13
• 14
• 15
• 16
• 17
• 18
• 19
• 20

总结

本篇博客介绍了文件的上传与下载的常见方式,并通过优化手段提升性能和用户体验。同时,还介绍了JRebel工具的简介以及如何批量下载图片。通过学习和应用这些方法,可以更好地满足开发需求并提升开发效率。


相关文章
|
设计模式 敏捷开发 jenkins
软件测试中的自动化测试实践指南
本文旨在探讨软件测试中自动化测试的实施方法及其重要性,通过具体案例分析自动化测试的步骤、工具选择及最佳实践。我们将从自动化测试的基本概念入手,逐步解析其在实际项目中的应用,并提供一些常见问题的解决方案。
775 5
|
Web App开发 定位技术 iOS开发
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
Playwright 是一个强大的工具,用于在各种浏览器上测试应用,并模拟真实设备如手机和平板。通过配置 `playwright.devices`,可以轻松模拟不同设备的用户代理、屏幕尺寸、视口等特性。此外,Playwright 还支持模拟地理位置、区域设置、时区、权限(如通知)和配色方案,使测试更加全面和真实。例如,可以在配置文件中设置全局的区域设置和时区,然后在特定测试中进行覆盖。同时,还可以动态更改地理位置和媒体类型,以适应不同的测试需求。
1040 1
|
安全 Ubuntu Unix
【Linux】基础指令
本文介绍了Linux操作系统的基本概念及特点,强调了其开源性、多用户多任务处理能力、稳定性和安全性。文章重点讲解了多个Linux基础命令,如ls、cd、touch、mkdir、rm、man、cp、mv、cat、less、find、grep、tar等,旨在帮助初学者快速掌握Linux命令行操作,为后续深入学习奠定基础。
329 0
|
前端开发 JavaScript 测试技术
深入理解自动化测试框架:Selenium与Appium的比较
【5月更文挑战第29天】 在快速发展的软件行业中,自动化测试已成为保证软件质量和缩短发布周期的关键。本文深入分析了两个领先的自动化测试框架——Selenium和Appium,探讨了它们的核心原理、应用场景以及优缺点。通过细致的比较,为软件开发团队提供选择合适测试工具的参考依据,并强调了在不同环境下如何优化测试流程以提高测试效率和准确性。
|
缓存 资源调度 安全
深入探索Linux操作系统的心脏——内核配置与优化####
本文作为一篇技术性深度解析文章,旨在引领读者踏上一场揭秘Linux内核配置与优化的奇妙之旅。不同于传统的摘要概述,本文将以实战为导向,直接跳入核心内容,探讨如何通过精细调整内核参数来提升系统性能、增强安全性及实现资源高效利用。从基础概念到高级技巧,逐步揭示那些隐藏在命令行背后的强大功能,为系统管理员和高级用户打开一扇通往极致性能与定制化体验的大门。 --- ###
320 9
|
存储 安全 JavaScript
浏览器的同源策略
【10月更文挑战第31天】浏览器的同源策略是浏览器安全模型的重要组成部分,它通过限制不同源之间的资源交互,有效地保护了用户和网站的安全。开发者在进行Web开发时,需要充分理解和遵循同源策略,同时合理地运用各种跨域技术来满足业务需求,确保网站的安全性和功能性的平衡。
323 2
|
安全 网络协议 关系型数据库
黑客红客,都用过这个工具扫端口!
黑客红客,都用过这个工具扫端口!
405 2
|
Python
NumPy 数学函数库详解
【8月更文第30天】NumPy(Numerical Python)是 Python 中用于科学计算的核心库之一,它提供了大量的高性能数学函数,并且是其他许多科学计算库的基础。本文将详细介绍 NumPy 中的数学函数,包括统计函数、线性代数函数以及傅里叶变换等功能。
326 0
|
存储 Linux
Linux文件管理(超详细讲解)
Linux文件管理(超详细讲解)
655 5
|
机器学习/深度学习 PyTorch TensorFlow

热门文章

最新文章