以下是详细的“SpringMVC实现文件上传和下载的工具类”的攻略。
目录
准备工作
在实现文件上传和下载之前,我们需要在pom.xml文件中添加相关的依赖项。如果你使用的是Maven,请在该文件中添加以下依赖项:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
同时,我们还需要在web.xml文件中添加相关的配置项,如下所示:
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
上面的配置项中,需要注意的是contextConfigLocation
。这里指定了springmvc-config.xml的配置文件路径,这个配置文件需要我们自己新建。
文件上传
文件上传是比较常见的操作,SpringMVC提供了很简单的方式来实现。下面我们来看看具体的实现步骤。
前端页面
首先,我们需要在前端页面中添加文件上传的表单。具体的代码如下所示:
<form action="uploadFile" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
上面的代码中,我们使用了HTML的form标签来添加文件上传的表单,其中action字段指定了上传请求的路径,这个后面会在后端Controller中实现。同时,我们也需要在input标签中指定type为file。
后端Controller
代码示例1:
@Controller
public class FileController {
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public String uploadFile(@RequestParam("file") MultipartFile file,ModelMap model) {
//获取文件名
String originalFilename=file.getOriginalFilename();
//获取文件的扩展名
String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
//设置文件名字
String fileName=UUID.randomUUID().toString()+"."+fileSuffix;
//指定文件上传的路径
File dest=new File("D:/uploadFile/"+fileName);
try {
//上传文件
file.transferTo(dest);
model.addAttribute("msg","上传成功");
} catch (IOException e) {
model.addAttribute("msg","上传失败");
e.printStackTrace();
}
return "uploadResult";
}
}
上面的代码中,我们使用了@RequestParam
注解来获取MultipartFile类型的文件对象,并且使用了transferTo
方法将文件保存到指定的路径下。这里指定了D:/uploadFile为上传文件的路径,你可以根据自己的需求进行修改。
需要注意的是,在默认情况下,上传的文件是会受到大小限制的,这个大小限制默认为1MB。如果你想修改这个限制,可以在web.xml文件中添加以下配置项:
<multipart-config>
<!--限制单个上传文件大小-->
<max-file-size>50MB</max-file-size>
<!--限制上传文件总大小-->
<max-request-size>100MB</max-request-size>
<!--设置临界值,当文件大于这个值时,才会写入临时文件夹。-->
<file-size-threshold>0</file-size-threshold>
</multipart-config>
代码示例2:
@Controller
public class FileController {
@ResponseBody
@RequestMapping(value="/upload", method=RequestMethod.POST)
public String upload(HttpServletRequest request){
//创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver =
new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求
if(multipartResolver.isMultipart(request)){
//转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
//取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
//取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if(file != null){
//取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
if(myFileName != null && myFileName.trim() !=""){
try {
//保存文件
FileUtils.copyInputStreamToFile(file.getInputStream(), new File("D:/uploadFile/"+myFileName));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return "上传成功";
}
}
上面的代码中,我们使用了CommonsMultipartResolver来处理文件上传,并通过FileUtils.copyInputStreamToFile
方法来保存文件到指定的路径下。
文件下载
文件下载与文件上传类似,同样是使用SpringMVC提供的方法来实现。下面我们来看看具体的实现步骤。
后端Controller
首先,我们需要在后端Controller中实现文件下载的方法。具体的代码如下:
@RequestMapping("/downloadFile")
public ResponseEntity<InputStreamResource> downloadFile(@RequestParam String fileName) throws IOException {
ClassPathResource file = new ClassPathResource("downloadFile/"+fileName+".pdf");
InputStreamResource resource = new InputStreamResource(file.getInputStream());
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getFilename()));
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
ResponseEntity<InputStreamResource> response = ResponseEntity.ok().headers(headers).contentLength(file.contentLength()).contentType(MediaType.parseMediaType("application/octet-stream")).body(resource);
return response;
}
上面的代码中,我们使用了InputStreamResource类来将文件转换为流,并通过ResponseEntity对象将流导出到前端,用于实现文件下载的功能。同时,我们也使用了HttpHeaders来设置响应头信息,让浏览器以下载的方式打开文件。
需要注意的是,上面代码中的文件路径是在class路径下,如果你想下载的文件不在该路径下,需要将路径进行相应的修改。
前端页面
最后,我们需要在前端页面中添加下载链接。具体的代码如下:
<a href="downloadFile?fileName=test">下载文件</a>
上面的代码中,我们使用了a标签添加了下载链接,其中的href路径为下载请求的路径,这个路径会在后端Controller中进行拦截和处理。
总结
通过上述的攻略,我们可以很容易地实现文件上传和下载的操作。需要注意的是,这里只是提供了一种比较基础的实现方式,如果你有更加复杂的需求,可以根据自己的情况进行相应的修改和扩展。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC实现文件上传和下载的工具类 - Python技术站