JAVA实现文件上传和下载

170 阅读2分钟

JAVA在SSM框架中实现文件的上传和下载

  1. 前期准备工作
    • 在pom.xml文件中导入依赖配置

       <dependency>
                  <groupId>commons-fileupload</groupId>
                  <artifactId>commons-fileupload</artifactId>
                  <version>1.3.1</version>
       </dependency>
      
    • 在SpringMVC的核心配置文件中配置文件上传解析器

       <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
           	//设置文件编码   
           	<property name="defaultEncoding" value="UTF-8"/>
       </bean>
      
  2. 文件上传

    注意:

    ​ 1.文件上传可能会出现重名现象,因此可以使用 UUID 对文件进行重命名操作,避免出现重名的现象

    ​ 2. MultipartFile pimage 的参数名一定要与前端页面传过来的name中的值一致

    //Ajax理照片文件上传(将文件保存到项目工程target的指定目录下)
        @ResponseBody
        @RequestMapping("/ajaxImg")
        public Object ajaxImgFileUpload(MultipartFile pimage, HttpSession session) throws IOException {
            //获取上传的文件的文件名
            String uploadFileName = pimage.getOriginalFilename();
            //提取生成最终文件的文件名: UUID +上传文件名后缀
            saveFileName = FileNameUtil.getUUIDFileName() + FileNameUtil.getFileType(uploadFileName);
            //获取ServletContext对象,然后获取工程中target存储照片的目录真实路径
            String imagePath =session.getServletContext().getRealPath("image_big");
            //创建目录对应的File对象
            File file = new File(imagePath);
            //判断当前目录是否存在
            if(!file.exists()){
                //不存在,进行创建
                file.mkdir();
            }
            //拼接最终文件的全部路径
            String finalPath = imagePath + File.separator + saveFileName;
            //上传(转存)文件,存储到Target的目录下
            pimage.transferTo(new File(finalPath));
    
            //返回客户端JSON对象,封装图片的路径,在页面进行回显
            JSONObject imgObject = new JSONObject();
            imgObject.put("imgurl",saveFileName);
            //返回JSON对象的字符串形式
            return imgObject.toString();
        }
    
    • 文件名工具类
    public class FileNameUtil {
    
    	//根据UUID生成文件名
    	public static String getUUIDFileName() {
        UUID uuid = UUID.randomUUID();
    		//替代UUId字符串中的横杆字符
    		return uuid.toString().replace("-", "");
    	}
    
    
    	//从请求头中提取文件名和类型(Content-Disposition: form-data; name="myfile"; filename="a_left.jpg")
    	public static String getRealFileName(String context) {
    		//获取等号所处的位置下标
    		int index = context.lastIndexOf("=");
    		//字符串截取文件名
    		String fileName = context.substring(index + 2, context.length() - 1);
    		return fileName;  // 取出的文件名为: a_left.jpg
    	}
    
    
    	//根据给定的文件名获取文件后缀
    	public static String getFileType(String fileName){
    		//获取后缀名中点的下标位置
    		int index = fileName.lastIndexOf(".");
    		//返回后缀名 .jpg
    		return fileName.substring(index);
    	}
    }
    
    
  3. 文件下载
     //文件下载控制器
        @RequestMapping("/test/down")
        public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws
                IOException {
            //获取ServletContext对象
            ServletContext servletContext = session.getServletContext();
            //获取服务器中文件的真实路径
            String realPath = servletContext.getRealPath("/image");
            realPath = realPath + File.separator + "1.jpg";
            //创建输入流
            InputStream is = new FileInputStream(realPath);
            //创建字节数组 is.available代表输入流对应文件的字节数
            byte[] bytes = new byte[is.available()];
            //将流读到字节数组中
            is.read(bytes);
            //创建HttpHeaders对象设置响应头信息
            MultiValueMap<String, String> headers = new HttpHeaders();
            //设置要下载方式以及下载文件的名字
            headers.add("Content-Disposition", "attachment;filename=1.jpg");
            //设置响应状态码
            HttpStatus statusCode = HttpStatus.OK;
            //创建ResponseEntity对象
            ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers,statusCode);
            //关闭输入流
            is.close();
            return responseEntity;
        }