javaEE项目Multipartfile实现文件上传下载并解决上传与下载文件中文乱码的问题

里面包含了文件上传下载并解决上传与下载文件中文乱码的问题,运用正则表达式判断字符串中是否包含中文和得到一个文件夹下的所有文件的方法,几乎集合了上传下载所需要的所有东西.下面代码加红的部分就是这几个重要点!

知识要大家一起分享嘛.

首先,需要配置好Spring+Springmvc的环境

1.在maven中添加: 如果你不是用maven管理项目的话,就百度Multipartfile所需的jar包即可,然后添加上jar包即可

<!--文件上传下载支持jar包-->

<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>1.3</version>

</dependency>

2.在你配置视图解析器的xml里面添加:

<!-- 定义文件解释器 -->

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- 设置默认编码 解决了上传文件名乱码的问题-->

<property name="defaultEncoding" value="utf-8"></property>

<!-- 上传图片最大大小5M-->

<property name="maxUploadSize" value="5242440"></property>

</bean>

2.新建一个测试页面

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>文件上传下载</title>

</head>

<body>

<form action="uploadstudent" method="post" enctype="multipart/form-data">

选择文件:<input type="file" name="file" width="120px">

<input type="submit" value="上传">

</form>

<hr>

<form action="downstudent" method="get">

文件名:<input type="text" name="filename">

<input type="submit" value="下载">

</form>

</body>

</html>

3.新建一个controller页面

import org.springframework.stereotype.Controller;

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.ResponseBody;

import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.*;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

@Controller

public class FileController {

/**

* 前台得到教师上传的文件名 用于学生下载文件

* @param request

* @return

*/

@RequestMapping("/getAllFileStudent")

public File[] GetAllFileNameStudnet(HttpServletRequest request){

//得到路径

String path = request.getSession().getServletContext().getRealPath("importantFile");

File file = new File(path);

//得到该路径下的所有文件的属性

File[] array = file.listFiles();

return array;

}

/**

* 前台得到学生上传的文件名 用于教师下载文件

* @param request

* @return

*/

@RequestMapping("/getAllFileTeacher")

public File[] GetAllFileNameTeacher(HttpServletRequest request){

//得到路径

String path = request.getSession().getServletContext().getRealPath("uploadFile");

File file = new File(path);

File[] array = file.listFiles();

return array;

}

/**

* 学生文件上传功能

* @param file

* @return

* @throws IOException

*/

@RequestMapping(value="/uploadstudent",method= RequestMethod.POST)

@ResponseBody

public String uploadStudent(MultipartFile file, HttpServletRequest request) throws IOException{

//设置路径,该语句会自动的在该项目的target里面的项目名下的目录里面自动创建文件夹uploadFile,用于存放上传文件

String path = request.getSession().getServletContext().getRealPath("uploadFile");

//得到上传文件的文件名

String fileName = file.getOriginalFilename();

//创建文件

File dir = new File(path,fileName);

//判断目录是否存在,如果父目录不存在,调用mkdirs方法创建父目录与子目录

if(!dir.exists()){

dir.mkdirs();

}

//MultipartFile自带的解析文件的方法

file.transferTo(dir);

return "上传文件成功!";

}

/**

* 学生文件下载功能

* @param request

* @param response

* @param file

* @throws Exception

*/

@RequestMapping("/downstudent")

public void downStudent(

HttpServletRequest request,

HttpServletResponse response,

@RequestParam("filename") String file) throws Exception{

//模拟文件,获取文件下载路径,file为需要下载的文件名

String fileName = request.getSession().getServletContext().getRealPath("importantFile")+"/"+file;

//获取输入流

InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileName)));

//运用正则表达式判断文件名是否含有中文字符,进行转码,避免乱码

Pattern p = Pattern.compile("[\u4e00-\u9fa5]");

Matcher m = p.matcher(file);

//判断是否存在 存在进入循环

if (m.find()) {

//转码,避免下载文件时文件名中文乱码

String userAgent = request.getHeader("User-Agent");

byte[] bytes = userAgent.contains("MSIE") ? file.getBytes() : file.getBytes("UTF-8"); // file.getBytes("UTF-8")处理safari的乱码问题

file = new String(bytes, "ISO-8859-1");

}

//设置文件下载头

response.addHeader("Content-Disposition", String.format("attachment;filename=" + file));

//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型

response.setContentType("multipart/form-data");

BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());

int len = 0;

while((len = bis.read()) != -1){

out.write(len);

out.flush();

}

out.close();

}

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA高级架构

AOP如何实现及其原理

最近在开发中遇到了一个刚好可以用AOP实现的例子,就顺便研究了AOP的实现原理,把学习到的东西进行一个总结。文章中用到的编程语言为kotlin,需要的可以在ID...

23120
来自专栏编程坑太多

「小程序JAVA实战」 小程序wxss样式文件的使用(七)

PS:样式这块比较依赖html中的css,明白如何引用,关联关系,style的方式自定义样式。

13330
来自专栏java思维导图

Web 安全漏洞之 XSS 攻击

编者说:作为JS系工程师接触最多的漏洞我想就是 XSS 漏洞了,然鹅并不是所有的同学对其都有一个清晰的认识。今天我们请来了@卢士杰 同学为我们分享他眼中的 XS...

13820
来自专栏前端桃园

WebAssembly 为什么这么快?

WebAssembly 是一种使 JavaScript 以外的编程语言编写的代码能够在浏览器中运行的技术。所以当人们在讨论 WebAssembly 运行之快的时...

10120
来自专栏编程坑太多

「小程序JAVA实战」 小程序远程调试(九)

PS:最后想到了什么老铁,可以查看远端的代码是不是就可以获取到借鉴他的代码了。其实微信早就想到了,不是所有的都可以的。远端调试必须知道他的APPID的,不是说直...

15510
来自专栏Java3y

还在用Synchronized?Atomic你了解不?

之前在学习的时候也看过AtomicInteger类很多次了,一直没有去做相关的笔记。现在遇到问题了,于是就过来写写笔记,并希望在学习的过程中解决掉问题。

16210
来自专栏机器之心

深度学习碰上古文献,西南大学提出基于CNN的古彝文识别方法

摘要:作为世界六大古文字之一的古彝文记录下几千年来人类发展历史。针对古彝文的识别能够将这些珍贵文献材料转换为电子文档,便于保存和传播。由于历史发展,区域限制等多...

62520
来自专栏芋道源码1024

75 道 BAJT 高级 Java 面试题,你能答上几道?

希望大家在每天闲暇之余学习其中几道题目,日积月累,去 BAJT 面试时,一切都水到渠成。

25730
来自专栏程序员互动联盟

开发一套新的编程语言有多难?

开发一套编程语言,主要存在两个障碍,其一:任何一种编程语言都有其存在的必要性,所以要搞明白为什么要弄一套新的编程语言,首先一定要有市场需求所在,编程语言如同一个...

32530
来自专栏项勇

Python : ex1

10130

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励