文件上传下载

时间:2021-12-09 20:58:35
package cn.edu.hbcf.common.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;

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

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import cn.edu.hbcf.common.jackjson.JackJson;
import cn.edu.hbcf.common.vo.ExtReturn;

public class FileDownLoadUtils {
    private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);
    /**
     * 
     * @param filePath
     * @param fileName
     * @param response
     */
    public static void  downloadFile(String filePath,String fileName,HttpServletResponse response){
        InputStream input = null;
        ServletOutputStream output = null;
        try {
            File downloadFile = new File(filePath);
            // 判断文件夹是否存在,不存在则创建
            if (!downloadFile.getParentFile().exists()) {
                downloadFile.getParentFile().mkdirs();
            }
            // 判断是否存在这个文件
            if (!downloadFile.isFile()) {
                // 创建一个
                FileUtils.touch(downloadFile);
            }           
        
            //response.setContentType("application/octet-stream;charset=UTF-8");
            response.setContentType("application/x-download");  
            response.setCharacterEncoding("UTF-8");
           
//            response.setHeader("content-disposition", "attachment; filename=" + URLEncoder.encode(fileName,"UTF-8"));
          //解决中文乱码  
            response.setHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("UTF-8"),"iso-8859-1").replace(" ", "_"));  

            input = new FileInputStream(downloadFile);
            output = response.getOutputStream();
            IOUtils.copy(input, output);
            
        } catch (Exception e) {
            logger.error("Exception: ", e);
        } finally {
            
                try {
                    if(output != null){
                        output.flush();
                        output.close();
                    }
                    if(input != null){
                        input.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            
//            IOUtils.closeQuietly(output);
//            IOUtils.closeQuietly(input);
        }
    }
    
    

    public static String fileUpload(MultipartFile file, HttpServletRequest request,String saveFolder,long maxSize){
        String returnMsg  = null;
        try {
            
            // 保存的地址
            String savePath = request.getSession().getServletContext().getRealPath("/"+saveFolder);
            if(maxSize!=0 && file.getSize()>maxSize){
                returnMsg = JackJson.fromObjectToJson(new ExtReturn(false, "文件大小超过了"+maxSize/(1024*1024)+"M了,上传失败!"));
                return returnMsg;
            }
            // 上传的文件名 //需要保存
            String uploadFileName = file.getOriginalFilename();
            // 获取文件后缀名 //需要保存
            String fileType = StringUtils.substringAfterLast(uploadFileName, ".");
            // 以年月/天的格式来存放
            String dataPath = DateFormatUtils.format(new Date(), "yyyy-MM" + File.separator + "dd");
            // uuid来保存不会重复
            String saveName = UUID.randomUUID().toString().replace("-", "");
            // 最终相对于upload的路径,解决没有后缀名的文件 //需要保存
            // 为了安全,不要加入后缀名
            // \2011-12\01\8364b45f-244d-41b6-bbf4-8df32064a935,等下载的的时候在加入后缀名
            String finalPath = File.separator + dataPath + File.separator + saveName + ("".equals(fileType) ? "" : "." + fileType);
            logger.debug("savePath:{},finalPath:{}", new Object[] { savePath, finalPath });
            File saveFile = new File(savePath + finalPath);
            // 判断文件夹是否存在,不存在则创建
            if (!saveFile.getParentFile().exists()) {
                saveFile.getParentFile().mkdirs();
            }
            // 写入文件
            FileUtils.writeByteArrayToFile(saveFile, file.getBytes());
            // 保存文件的基本信息到数据库
            StringBuffer buffer = new StringBuffer();
            buffer.append("{success:true,fileInfo:{'fileName':'").append(uploadFileName).append("',");
            buffer.append("'filePath':'").append(savePath.replace("\\", "/")+finalPath.replace("\\", "/")).append("',");          
            buffer.append("'projectPath':'").append(saveFolder.replace("\\", "/")).append(finalPath.replace("\\", "/")).append("',");
            buffer.append("'storeName':'").append(saveName + ("".equals(fileType) ? "" : "." + fileType));
            buffer.append("'}}");
            returnMsg = buffer.toString();
            
        } catch (Exception e) {
            logger.error("Exception: ", e);
        }
        return returnMsg;
    }
    
    public static File upload(MultipartFile file,String saveFolder){
         File f = null;
         try {
            // 上传的文件名 //需要保存
            String uploadFileName = file.getOriginalFilename();
            // 获取文件后缀名 //需要保存
            String fileType = StringUtils.substringAfterLast(uploadFileName, ".");
            // 以年月/天的格式来存放
//            String dataPath = DateFormatUtils.format(new Date(), "yyyy-MM" + File.separator + "dd");
            // uuid来保存不会重复
            String saveName = UUID.randomUUID().toString().replace("-", "");
            // 最终相对于upload的路径,解决没有后缀名的文件 //需要保存
            // 为了安全,不要加入后缀名
            // \2011-12\01\8364b45f-244d-41b6-bbf4-8df32064a935,等下载的的时候在加入后缀名
            String finalPath = saveFolder + saveName + ("".equals(fileType) ? "" : "." + fileType);
            logger.debug("finalPath:{}", new Object[] {  finalPath });
            File saveFile = new File(finalPath);
            // 判断文件夹是否存在,不存在则创建
            if (!saveFile.getParentFile().exists()) {
                saveFile.getParentFile().mkdirs();
            }
            // 写入文件
            FileUtils.writeByteArrayToFile(saveFile, file.getBytes());
    
            f = new File(finalPath.replace("\\", "/"));
        } catch (Exception e) {
            logger.error("Exception: ", e);
        }
        return f;
    }

    public static File upload(MultipartFile file, HttpServletRequest request,String saveFolder){
        File f = null;
        try {
            
            // 保存的地址
            String savePath = request.getSession().getServletContext().getRealPath("/");
            if(saveFolder != null){
                  savePath += saveFolder;
            }
            // 上传的文件名 //需要保存
            String uploadFileName = file.getOriginalFilename();
            // 获取文件后缀名 //需要保存
            String fileType = StringUtils.substringAfterLast(uploadFileName, ".");
            // 以年月/天的格式来存放
       //    String dataPath = DateFormatUtils.format(new Date(), "yyyy-MM" + File.separator + "dd");
            // uuid来保存不会重复
            String saveName = UUID.randomUUID().toString().replace("-", "");
            // 最终相对于upload的路径,解决没有后缀名的文件 //需要保存
            // 为了安全,不要加入后缀名
            // \2011-12\01\8364b45f-244d-41b6-bbf4-8df32064a935,等下载的的时候在加入后缀名
            String finalPath =  File.separator + saveName + ("".equals(fileType) ? "" : "." + fileType);
            logger.debug("savePath:{},finalPath:{}", new Object[] { savePath, finalPath });
            f = new File(savePath + finalPath);
            // 判断文件夹是否存在,不存在则创建
            if (!f.getParentFile().exists()) {
                f.getParentFile().mkdirs();
            }
            // 写入文件
            FileUtils.writeByteArrayToFile(f, file.getBytes());
 
          //  f = new File(savePath.replace("\\", "/")+finalPath.replace("\\", "/"));
        } catch (Exception e) {
            logger.error("Exception: ", e);
        }
        return f;
    }

    /**
     * 创建文件夹
     * @param request
     * @param saveFolder
     * @return
     */
    public static File createFile(HttpServletRequest request,String saveFolder){
        // 保存的地址
        String savePath = request.getSession().getServletContext().getRealPath("/");
        if(saveFolder != null){
              savePath += saveFolder;
        }
        File file=new File(savePath);
     // 判断文件夹是否存在,不存在则创建
        if (!file.exists()) {
            file.mkdirs();
        }
        return file;
    }
}