首页>代码>spring mvc简单的图片与PDF文件互转>/com.pdf/src/main/java/com/pdf/controller/ImagesAndPDF.java
package com.pdf.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.pdf.util.ImagesPDFUtil;

/**
 * 图片转换成pdf
 * @author chenguoji
 *
 */
@Controller
public class ImagesAndPDF {

	
	/**
	 * 上传文件并处理转换
	 * @param request
	 * @param response
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping("/images")
	public String images(HttpServletRequest request,HttpServletResponse response){
	
	  //得到上传文件的保存目录
      String savePath = request.getServletContext().getRealPath("/upload");
      File file = new File(savePath);
      //判断上传文件的保存目录是否存在
      if (!file.exists() && !file.isDirectory()) {
          System.out.println(savePath+"目录不存在,需要创建");
          //创建目录
          file.mkdir();
      }
      //保存PDF文件目录
      String pdfUrl = request.getServletContext().getRealPath("/pdf");
      File file2 = new File(pdfUrl);
      //判断上传文件的保存目录是否存在
      if (!file2.exists() && !file2.isDirectory()) {
          System.out.println(pdfUrl+"目录不存在,需要创建");
          //创建目录
          file2.mkdir();
      }
      //消息提示
      String message = "";
      try{
          //使用Apache文件上传组件处理文件上传步骤:
          //1、创建一个DiskFileItemFactory工厂
          DiskFileItemFactory factory = new DiskFileItemFactory();
          //2、创建一个文件上传解析器
          ServletFileUpload upload = new ServletFileUpload(factory);
           //解决上传文件名的中文乱码
          upload.setHeaderEncoding("UTF-8"); 
          //3、判断提交上来的数据是否是上传表单的数据
          if(!ServletFileUpload.isMultipartContent(request)){
              //按照传统方式获取数据
              return "error";
          }
          //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
          List<FileItem> list = upload.parseRequest(request);
          for(FileItem item : list){
              //如果fileitem中封装的是普通输入项的数据
              if(item.isFormField()){
                  String name = item.getFieldName();
                  //解决普通输入项的数据的中文乱码问题
                  String value = item.getString("UTF-8");
//                  value = new String(value.getBytes("iso8859-1"),"UTF-8");
                  System.out.println(name + "=" + value);
              }else{//如果fileitem中封装的是上传文件
                  //得到上传的文件名称,
                  String filename = item.getName();
                  if(filename==null || filename.trim().equals("")){
                      continue;
                  }
                  //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
                  //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                  filename = filename.substring(filename.lastIndexOf("\\")+1);
                  //获取item中的上传文件的输入流
                  InputStream in = item.getInputStream();
                  //创建一个文件输出流
                  FileOutputStream out = new FileOutputStream(savePath + "\\" + filename);
                  //创建一个缓冲区
                  byte buffer[] = new byte[1024];
                  //判断输入流中的数据是否已经读完的标识
                  int len = 0;
                  //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                  while((len=in.read(buffer))>0){
                      //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
                      out.write(buffer, 0, len);
                  }
                  //关闭输入流
                  in.close();
                  //关闭输出流
                  out.close();
                  //删除处理文件上传时生成的临时文件
                  item.delete();
                  message = "文件上传成功!";
                  
                  System.out.println("图片上传路径:"+savePath);
                  System.out.println("图片上传路径文件名称:"+filename);
                  System.out.println("图片上传路径文件名称后缀名:"+item.getContentType());
                  
                  //转换成pdf文件
                  String imageUrl = savePath + "\\" + filename;
                  String name = filename.substring(0,filename.lastIndexOf("."));//获取除后缀1位的名称
                  //getFilename .substring(getFilename .lastIndexOf("."));//这个是获取后缀名
                  new ImagesPDFUtil().jpg2Pdf(imageUrl, pdfUrl+"\\" + name+".pdf");
              }
          }
      }catch (Exception e) {
          message= "文件上传失败!";
          e.printStackTrace();
      }
      request.setAttribute("success", message);
      return "redirect:/query"; 
	}
	
	
	/**
	 * 查询转换的pdf文件
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping("/query")
	public String query(HttpServletRequest request, HttpServletResponse response){
		//转换目录
		String pdfPath = request.getServletContext().getRealPath("/pdf");
		Map<String,String> pdfMap = new HashMap<String,String>();
		listfile(new File(pdfPath),pdfMap);//File既可以代表一个文件也可以代表一个目录
		request.setAttribute("pdfMap", pdfMap);
		return "message";
	}
	
	
	/**
	* @Description: 递归遍历指定目录下的所有文件
	* @param file 即代表一个文件,也代表一个文件目录
	* @param map 存储文件名的Map集合
	*/ 
	public void listfile(File file,Map<String,String> map){
	    //如果file代表的不是一个文件,而是一个目录
	    if(!file.isFile()){
	        //列出该目录下的所有文件和目录
	        File files[] = file.listFiles();
	        //遍历files[]数组
	        for(File f : files){
	            //递归
	            listfile(f,map);
	        }
	    }else{
	        /**
	         * 处理文件名
	         */
	        String realName = file.getName().substring(file.getName().indexOf("_")+1);
	        //file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复
	        map.put(file.getName(), realName);
	    }
	}
	
	/**
	 * 下载文件
	 * @param path  pdf路径
	 * @param name  文件名称
	 * @param request
	 * @param response
	 */
	@RequestMapping("/download")
	public void download(String filename, HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		try {
			//得到要下载的文件名
			  String fileName = filename;
			  fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
			 //转换的pdf文件保存在pdf目录当中
			  String path=request.getServletContext().getRealPath("/pdf");
			  //得到要下载的文件
			  File file = new File(path + "\\" + fileName);
			  //如果文件不存在
			  if(!file.exists()){
			      request.setAttribute("message", "您要下载的资源已被删除!!");
			      return;
			  }
			  //处理文件名
			  String realname = fileName.substring(fileName.indexOf("_")+1);
			  //设置响应头,控制浏览器下载该文件
			  response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
			  //读取要下载的文件,保存到文件输入流
			  FileInputStream in = new FileInputStream(path + "\\" + fileName);
			  //创建输出流
			  OutputStream out = response.getOutputStream();
			  //创建缓冲区
			  byte buffer[] = new byte[1024];
			  int len = 0;
			  //循环将输入流中的内容读取到缓冲区当中
			  while((len=in.read(buffer))>0){
			      //输出缓冲区的内容到浏览器,实现文件下载
			      out.write(buffer, 0, len);
			  }
			  //关闭文件输入流
			  in.close();
			  //关闭输出流
			  out.close();
			  
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
最近下载更多
Sisphyus  LV1 2022年2月17日
我的最代码  LV20 2022年1月14日
xuexizhuanyong23  LV16 2021年9月24日
xmjying  LV13 2020年3月19日
lsongssl  LV2 2019年6月14日
DU-ZB  LV13 2019年3月27日
麻辣小龙虾  LV11 2019年3月12日
zhangshu6682  LV7 2019年1月6日
tanyunqing  LV8 2018年7月11日
gggbbbb  LV1 2018年6月12日
最近浏览更多
ssy552  LV10 2023年2月23日
xytthy  LV3 2022年4月25日
Chen2618kk 2022年3月19日
暂无贡献等级
Sisphyus  LV1 2022年2月17日
我的最代码  LV20 2022年1月14日
lvhaowen  LV20 2021年11月6日
xuexizhuanyong23  LV16 2021年9月24日
xsp990218  LV5 2021年8月16日
13043860zj  LV16 2021年5月24日
Cat. 2021年5月16日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友