精华内容
下载资源
问答
  • java实现文件下载

    2013-08-06 12:00:11
    java实现的文件上传下载,struts2实现的文件上传下载~!
  • Java多文件压缩下载解决方案

    万次阅读 2018-09-07 18:00:33
    Java多文件压缩下载解决方案 需求: 会员运营平台经过改版后页面增加了许多全部下载链接,上周上线比较仓促,全部下载是一个直接下载ZIP压缩文件的链接,每个ZIP压缩文件都是由公司运营人员将页面需要下载文件...

    Java多文件压缩下载解决方案

    需求:

    会员运营平台经过改版后页面增加了许多全部下载链接,上周上线比较仓促,全部下载是一个直接下载ZIP压缩文件的链接,每个ZIP压缩文件都是由公司运营人员将页面需要下载的文件全部压缩成一个ZIP压缩文件,然后通过公司的交易运营平台上传至文件资料系统,会员运营平台则可以直接获取ZIP压缩文件地址进行下载

    下面是一个页面示例:

    需求分析:

    通过上面需求和页面可以分析出,公司运营人员将页面全部需要下载的文件进行ZIP压缩后上传文件资料系统确实是一个紧急的解决方案,但是考虑到后面需求变更,页面需要下载的文件也会跟着变更,每次变更需求,公司运营人员都需要重新进行压缩文件,程序也需要进行相应的修改,这样对于程序的维护性不友好,站在使用系统的客户角度,每次都需要重新上传,因此临时解决方案不再符合软件的良好扩展性和操作方便,因此才有了对页面需要全部下载的文件使用程序压缩处理并下载。

     

    解决思路:

    第一步:前端传递Ids字符串

    由于会员运营系统显示需要下载的文件是资料系统中的每条文件记录的Id,因此前端页面只需要将需要下载的所有文件Ids字符串(比如:'12,13,14')传递到后台即可.

    第二步:后台处理

    首先获取到前端传递的ids字符串,将其转换为Integer[]的ids数组,然后调用文件资料微服务根据id列表查询对应的文件记录(包含文件类型和文件地址路径等信息),获取到所有需要下载的文件路径后压缩成ZIP格式的文件进行下载。

     

    具体实现压缩下载方案:

    第一种:先压缩成ZIP格式文件,再下载

    第二种:边压缩ZIP格式文件边下载(直接输出ZIP流)

     

    前端具体实现代码:

    由于全部下载是一个a链接标签,于是使用Ajax异步下载,后来功能实现后点击下载一点反应都没有,一度怀疑是后台出错,但是后台始终没有报错,在网上看了一下Ajax异步不能下载文件(也就是Ajax不支持流类型数据),具体原因可以百度https://blog.csdn.net/qq_16877261/article/details/54376430这篇博客,解释的还算是比较好的。后面会写一篇=文章详细分析Ajax异步下载解决方案。

    接下来考虑使用form表单标签实现,最终配合使用input标签实现了前端传递ids列表的问题,点击a链接标签触发提交form标签即可。

    在每一个需要下载的文件增加一个隐藏的input标签,value值是这个文件的id值

    具体点击a链接标签提交表单的JS代码:

     

    后端具体实现代码:

    第一种方案实现:

    第二种方案实现:

    附上完整代码:

    压缩下载Controller

    package com.huajin.jgoms.controller.user;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    import java.util.Objects;
    import java.util.stream.Collectors;
    
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.collections.CollectionUtils;
    import org.apache.commons.lang3.ObjectUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.huajin.baymax.logger.XMsgError;
    import com.huajin.baymax.logger.Xlogger;
    import com.huajin.common.util.UUIDUtil;
    import com.huajin.exchange.domain.sys.FeFileCenter;
    import com.huajin.exchange.enums.sys.SysParamKey;
    import com.huajin.exchange.po.sys.SysParamPo;
    import com.huajin.jgoms.controller.HjBaseController;
    import com.huajin.jgoms.service.FeFileCenterService;
    import com.huajin.jgoms.service.SysParamService;
    import com.huajin.jgoms.util.CompressDownloadUtil;
    
    /**
     * 压缩下载文件
     *
     * @author hongwei.lian
     * @date 2018年9月6日 下午6:29:05
     */
    @Controller
    @RequestMapping("/compressdownload")
    public class CompressDownloadController extends HjBaseController {
    	
    	@Autowired
    	private FeFileCenterService feFileCenterService;
    	
    	@Autowired
    	private SysParamService sysParamService;
    
    	/**
    	 * 多文件压缩下载
    	 * 
    	 * @author hongwei.lian
    	 * @date 2018年9月6日 下午6:28:56
    	 */
    	@RequestMapping("/downloadallfiles")
    	public void downloadallfiles() {
    		//-- 1、根据ids查询下载的文件地址列表
    		String ids = request().getParameter("ids");
    		if (StringUtils.isEmpty(ids)) {
    			return ;
    		}
    		//-- 将字符串数组改变为整型数组
    		Integer[] idsInteger = CompressDownloadUtil.toIntegerArray(ids);
    		List<FeFileCenter> fileCenters = feFileCenterService.getFeFileByIds(super.getExchangeId(), idsInteger);
    		if (CollectionUtils.isNotEmpty(fileCenters) && ObjectUtils.notEqual(idsInteger.length, fileCenters.size())) {
    			//-- 要下载文件Id数组个数和返回的文件地址个数不一致
    			return ;
    		}
    		
    		//-- 2、转换成文件列表
    		List<File> files = this.toFileList(fileCenters);
    		//-- 检查需要下载多文件列表中文件路径是否都存在
    		for (File file : files) {
    			if (!file.exists()) {
    				//-- 需要下载的文件中存在不存在地址
    				return ;
    			}
    		}
    		
    		//-- 3、响应头的设置
    		String downloadName = UUIDUtil.getUUID() + ".zip";
    		HttpServletResponse response = CompressDownloadUtil.setDownloadResponse(super.response(), downloadName);
    		
    		//-- 4、第一种方案:
    		//-- 指定ZIP压缩包路径
    //		String zipFilePath = this.setZipFilePath(downloadName);
    //		try {
    //			//-- 将多个文件压缩到指定路径下
    //			CompressDownloadUtil.compressZip(files, new FileOutputStream(zipFilePath));
    //			//-- 下载压缩包
    //			CompressDownloadUtil.downloadFile(response.getOutputStream(), zipFilePath);
    //			//-- 删除临时生成的ZIP文件
    //			CompressDownloadUtil.deleteFile(zipFilePath);
    //		} catch (IOException e) {
    //			Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadallfiles", e));
    //		}
    		
    		//-- 5、第二种方案:
    	   try {
    		    //-- 将多个文件压缩写进响应的输出流
    			CompressDownloadUtil.compressZip(files, response.getOutputStream());
    		} catch (IOException e) {
    			Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadallfiles", e));
    		}
    		
    	}
    
    	/**
    	 * 设置临时生成的ZIP文件路径
    	 *
    	 * @param fileName
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:54:13
    	 */
    	private String setZipFilePath(String fileName) {
    		String zipPath = sysParamService.getCompressDownloadFilePath();
    		File zipPathFile = new File(zipPath);
    		if (!zipPathFile.exists()) {
    			zipPathFile.mkdirs();
    		}
    		return zipPath + File.separator + fileName;
    	}
    
    	/**
    	 * 将fileCenters列表转换为File列表
    	 *
    	 * @param fileCenters
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月6日 下午6:54:16
    	 */
    	private List<File> toFileList(List<FeFileCenter> fileCenters) {
    		return fileCenters.stream()
                                         .map(feFileCenter -> {
                                        	 //-- 获取每个文件的路径
                                        	 String filePath = this.getSysFilePath(feFileCenter.getFileTypeId());
                                             return new File(filePath + feFileCenter.fileLink());})
                                         .collect(Collectors.toList());
    	}
    	
    	/**
    	 * 获取文件类型对应存储路径
    	 *
    	 * @param fileTypeId
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月5日 下午2:01:53
    	 */
    	private String getSysFilePath(Integer fileTypeId){
    		SysParamPo sysmParam = sysParamService.getByParamKey(SysParamKey.FC_UPLOAD_ADDRESS.value);
    		String filePath = Objects.nonNull(sysmParam) ? sysmParam.getParamValue() : "";
    		return filePath + fileTypeId + File.separator;
    	}
    
    }

    压缩下载工具类

    package com.huajin.jgoms.util;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Objects;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    import javax.servlet.http.HttpServletResponse;
    
    import com.huajin.baymax.logger.XMsgError;
    import com.huajin.baymax.logger.Xlogger;
    
    /**
     * 压缩下载工具类
     *
     * @author hongwei.lian
     * @date 2018年9月6日 下午6:34:56
     */
    public class CompressDownloadUtil {
    	
    	private CompressDownloadUtil() {}
    	
    	/**
    	 * 设置下载响应头
    	 *
    	 * @param response
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:01:59
    	 */
    	public static HttpServletResponse setDownloadResponse(HttpServletResponse response, String downloadName) {
    		response.reset();
    		response.setCharacterEncoding("utf-8");
    		response.setContentType("application/octet-stream");
    		response.setHeader("Content-Disposition", "attachment;fileName*=UTF-8''"+ downloadName);
    		return response;
    	}
    	
    	/**
    	 * 字符串转换为整型数组
    	 *
    	 * @param param
    	 * @return 
    	 * @author hongwei.lian
    	 * @date 2018年9月6日 下午6:38:39
    	 */
    	public static Integer[] toIntegerArray(String param) {
    		return Arrays.stream(param.split(","))
                                  .map(Integer::valueOf)
                                  .toArray(Integer[]::new);
    	}
    	
    	/**
    	 * 将多个文件压缩到指定输出流中
    	 *
    	 * @param files 需要压缩的文件列表
    	 * @param outputStream  压缩到指定的输出流
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:11:59
    	 */
    	public static void compressZip(List<File> files, OutputStream outputStream) {
    		ZipOutputStream zipOutStream = null;
    		try {
    			//-- 包装成ZIP格式输出流
    			zipOutStream = new ZipOutputStream(new BufferedOutputStream(outputStream));
    			// -- 设置压缩方法
    			zipOutStream.setMethod(ZipOutputStream.DEFLATED);
    			//-- 将多文件循环写入压缩包
    			for (int i = 0; i < files.size(); i++) {
    				File file = files.get(i);
    				FileInputStream filenputStream = new FileInputStream(file);
    				byte[] data = new byte[(int) file.length()];
    				filenputStream.read(data);
    				//-- 添加ZipEntry,并ZipEntry中写入文件流,这里,加上i是防止要下载的文件有重名的导致下载失败
    				zipOutStream.putNextEntry(new ZipEntry(i + file.getName()));
    				zipOutStream.write(data);
    				filenputStream.close();
    				zipOutStream.closeEntry();
    			}
    		} catch (IOException e) {
    			Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadallfiles", e));
    		}  finally {
    			try {
    				if (Objects.nonNull(zipOutStream)) {
    					zipOutStream.flush();
    					zipOutStream.close();
    				}
    				if (Objects.nonNull(outputStream)) {
    					outputStream.close();
    				}
    			} catch (IOException e) {
    				Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadallfiles", e));
    			}
    		}
    	}
    	
    	/**
    	 * 下载文件
    	 *
    	 * @param outputStream 下载输出流
    	 * @param zipFilePath 需要下载文件的路径
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:27:08
    	 */
    	public static void downloadFile(OutputStream outputStream, String zipFilePath) {
    		File zipFile = new File(zipFilePath);
    		if (!zipFile.exists()) {
    			//-- 需要下载压塑包文件不存在
    			return ;
    		}
    		FileInputStream inputStream = null;
    		try {
    			inputStream = new FileInputStream(zipFile);
    			byte[] data = new byte[(int) zipFile.length()];
    			inputStream.read(data);
    			outputStream.write(data);
    			outputStream.flush();
    		} catch (IOException e) {
    			Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadZip", e));
    		} finally {
    			try {
    				if (Objects.nonNull(inputStream)) {
    					inputStream.close();
    				}
    				if (Objects.nonNull(outputStream)) {
    					outputStream.close();
    				}
    			} catch (IOException e) {
    				Xlogger.error(XMsgError.buildSimple(CompressDownloadUtil.class.getName(), "downloadZip", e));
    			}
    		}
    	}
    	
    	/**
    	 * 删除指定路径的文件
    	 *
    	 * @param filepath 
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:44:53
    	 */
    	public static void deleteFile(String filepath) {
    		File file = new File(filepath);
    		deleteFile(file);
    	}
    	
    	/**
    	 * 删除指定文件
    	 *
    	 * @param file 
    	 * @author hongwei.lian
    	 * @date 2018年9月7日 下午3:45:58
    	 */
    	public static void deleteFile(File file) {
    		//-- 路径为文件且不为空则进行删除  
    	    if (file.isFile() && file.exists()) {  
    	        file.delete();  
    	    } 
    	}
    
    }
    

    测试

    通过交易运营平台上传测试资料

    登录会员运营平台进行下载

    下载下来的ZIP格式为文件

    解压后,打开文件是否可用:

     

    总结:

    这个过程中出现了很多问题,后面会有文章逐步分析出错和解决方案。

    上述两种方案都行,但是为了响应速度更快,可以省略压缩成ZIP的临时文件的时间,因此采用了第二种解决方案。

     

    展开全文
  • JAVA 如何一次下载多文件

    千次阅读 2021-03-09 22:21:22
    } } /** * 通过截取URL地址获得文件名 * 注意:还有一种下载地址是没有文件后缀的,这个需要通过响应头中的 * Content-Disposition字段 获得filename,一般格式为:"attachment; filename=\xxx.exe\" * @param url ...

    future = pool.submit(new Callable(){

    @Override

    public HttpURLConnection call() throws Exception {

    HttpURLConnection connection = null;

    connection = (HttpURLConnection) new URL(url).openConnection();

    connection.setConnectTimeout(10000);//连接超时时间

    connection.setReadTimeout(10000);// 读取超时时间

    connection.setDoInput(true);

    connection.setDoOutput(true);

    connection.setRequestMethod("GET");

    //断点续连,每次要算出range的范围,请参考Http 1.1协议

    //connection.setRequestProperty("Range", "bytes=0");

    connection.connect();

    return connection;

    }

    });

    connection = future.get();

    System.out.println("下载完成.响应码:"+ connection.getResponseCode());

    // 写入文件

    writeFile(new BufferedInputStream(connection.getInputStream()), URLDecoder.decode(filename,"UTF-8"));

    }

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    if (null != connection)

    connection.disconnect();

    if (null != pool)

    pool.shutdown();

    }

    }

    /**

    * 通过截取URL地址获得文件名

    * 注意:还有一种下载地址是没有文件后缀的,这个需要通过响应头中的

    * Content-Disposition字段 获得filename,一般格式为:"attachment; filename=\xxx.exe\"

    * @param url

    * @return

    */

    static String getFilename(String url){

    return ("".equals(url) || null == url) ? "" : url.substring(url.lastIndexOf("/") + 1,url.length());

    }

    /**

    * 写入文件

    * @param inputStream

    */

    static void writeFile(BufferedInputStream bufferedInputStream,String filename){

    //创建本地文件

    File destfileFile = new File("d:\\temp\\download\\"+ filename);

    if (destfileFile.exists()) {

    destfileFile.delete();

    }

    if (!destfileFile.getParentFile().exists()) {

    destfileFile.getParentFile().mkdir();

    }

    FileOutputStream fileOutputStream = null;

    try {

    fileOutputStream = new FileOutputStream(destfileFile);

    byte[] b = new byte[1024];

    int len = 0;

    // 写入文件

    System.out.println("开始写入本地文件.");

    while ((len = bufferedInputStream.read(b, 0, b.length)) != -1) {

    System.out.println("正在写入字节:" + len);

    fileOutputStream.write(b, 0, len);

    }

    System.out.println("写入本地文件完成.");

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    } finally {

    try {

    if (null != fileOutputStream) {

    fileOutputStream.flush();

    fileOutputStream.close();

    }

    if (null != bufferedInputStream)

    bufferedInputStream.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    }

    展开全文
  • 实现将个word文件合并成一个word文档,整理两种方法,所需资料比较齐全,已经过测试,可直接下载使用。
  • java实现服务器上文件先打包,然后下载下载完成后删除包!
  • java多线程下载文件

    2011-10-12 12:25:17
    java多线程断点下载文件文档介绍及代码实现
  • Java一次性下载多文件

    千次阅读 2019-09-12 15:46:08
    最近项目遇到一个需求,需要一次性导出全部数据-,而且是按照500条数据一个文件。 话不说,开始。 新增Excel工具类 可以直接复制 import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util....

    最近项目遇到一个需求,需要一次性导出全部数据-,而且是按照500条数据一个文件。
    话不多说,开始。

    新增Excel工具类

    可以直接复制

    
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.util.CellRangeAddress;
    //关于下面这两个包,可以直接用Java自带的,也可以导入
    //我这里是导入的,可以进行一个编码的设置,不过我是没有设置成功,反而乱码
    //建议里面的文件名什么的都用英文,不用担心乱码,哈哈
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipOutputStream;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ExportExcel {
    
        // 显示的导出表的标题
        private String title;
        // 导出表的列名
        private String[] rowName;
        private List<Object[]> dataList = new ArrayList<Object[]>();
    
        public ExportExcel() {
        }
    
        // 构造函数,传入要导出的数据
        public ExportExcel(String title, String[] rowName, List<Object[]> dataList) {
            this.dataList = dataList;
            this.rowName = rowName;
            this.title = title;
        }
    
        // 导出数据
        public void export(OutputStream out) throws Exception {
            try {
                HSSFWorkbook workbook = new HSSFWorkbook();
                HSSFSheet sheet = workbook.createSheet(title);
    
                // 产生表格标题行
                HSSFRow rowm = sheet.createRow(0);
                HSSFCell cellTitle = rowm.createCell(0);
    
    
                //sheet样式定义【】
                HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);
                HSSFCellStyle style = this.getStyle(workbook);
                sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length - 1)));
                cellTitle.setCellStyle(columnTopStyle);
                cellTitle.setCellValue(title);
    
                // 定义所需列数
                int columnNum = rowName.length;
                HSSFRow rowRowName = sheet.createRow(2);
    
                // 将列头设置到sheet的单元格中
                for (int n = 0; n < columnNum; n++) {
                    HSSFCell cellRowName = rowRowName.createCell(n);
                    cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);
                    HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
                    cellRowName.setCellValue(text);
                    cellRowName.setCellStyle(columnTopStyle);
    
                }
                // 将查询到的数据设置到sheet对应的单元格中
                for (int i = 0; i < dataList.size(); i++) {
                    Object[] obj = dataList.get(i);// 遍历每个对象
                    HSSFRow row = sheet.createRow(i + 3);// 创建所需的行数
    
                    for (int j = 0; j < obj.length; j++) {
                        HSSFCell cell = null;
                        //这几行被注释掉的代码,是给表格第一列进行一个赋值起一个编号的效果,不过我认为没必要
    //                    if (j == 0) {
    //                        cell = row.createCell(j, HSSFCell.CELL_TYPE_NUMERIC);
    //                        cell.setCellValue(i + 1);
    //                    } else {
                            cell = row.createCell(j, HSSFCell.CELL_TYPE_STRING);
                            if (!"".equals(obj[j]) && obj[j] != null) {
                                cell.setCellValue(obj[j].toString());
                            }
    //                    }
                        cell.setCellStyle(style);
    
                    }
    
                }
    
                // 让列宽随着导出的列长自动适应
                for (int colNum = 0; colNum < columnNum; colNum++) {
                    int columnWidth = sheet.getColumnWidth(colNum) / 256;
                    for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                        HSSFRow currentRow;
                        if (sheet.getRow(rowNum) == null) {
                            currentRow = sheet.createRow(rowNum);
                        } else {
                            currentRow = sheet.getRow(rowNum);
                        }
                        if (currentRow.getCell(colNum) != null) {
                            HSSFCell currentCell = currentRow.getCell(colNum);
                            if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                                int length = currentCell.getStringCellValue().getBytes().length;
                                if (columnWidth < length) {
                                    columnWidth = length;
                                }
                            }
                        }
                    }
                    if (colNum == 0) {
                        sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
                    } else {
                        sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
                    }
                }
    
                if (workbook != null) {
                    try {
    
                        workbook.write(out);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
            } catch (Exception e) {
    
            }
    
    
        }
    
        /**
                * 列头单元格样式
       */
        public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
            // 设置字体
            HSSFFont font = workbook.createFont();
    
            // 设置字体大小
            font.setFontHeightInPoints((short) 11);
            // 字体加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("Courier New");
            // 设置样式
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置低边框
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            // 设置低边框颜色
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            // 设置右边框
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            // 设置顶边框
            style.setTopBorderColor(HSSFColor.BLACK.index);
            // 设置顶边框颜色
            style.setTopBorderColor(HSSFColor.BLACK.index);
            // 在样式中应用设置的字体
            style.setFont(font);
            // 设置自动换行
            style.setWrapText(false);
            // 设置水平对齐的样式为居中对齐;
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            return style;
    
        }
    
        public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
            // 设置字体
            HSSFFont font = workbook.createFont();
            // 设置字体大小
            font.setFontHeightInPoints((short) 10);
            // 字体加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("Courier New");
            // 设置样式;
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置底边框;
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            // 设置底边框颜色;
            style.setBottomBorderColor(HSSFColor.BLACK.index);
            // 设置左边框;
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            // 设置左边框颜色;
            style.setLeftBorderColor(HSSFColor.BLACK.index);
            // 设置右边框;
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            // 设置右边框颜色;
            style.setRightBorderColor(HSSFColor.BLACK.index);
            // 设置顶边框;
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            // 设置顶边框颜色;
            style.setTopBorderColor(HSSFColor.BLACK.index);
            // 在样式用应用设置的字体;
            style.setFont(font);
            // 设置自动换行;
            style.setWrapText(false);
            // 设置水平对齐的样式为居中对齐;
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            return style;
        }
    
        //压缩文件
        public void ZipFiles(File[] srcfile, File zipfile) {
            ZipOutputStream out = null;
    
            byte[] buf = new byte[1024];
            try {
                out = new ZipOutputStream(new FileOutputStream(
                        zipfile));
    //            out.setEncoding("UTF-8");
                for (int i = 0; i < srcfile.length; i++) {
                    FileInputStream in = new FileInputStream(srcfile[i]);
                    out.putNextEntry(new ZipEntry(srcfile[i].getName()));
                    int len;
                    while ((len = in.read(buf)) > 0) {
                        out.write(buf, 0, len);
                    }
                    out.closeEntry();
                    in.close();
                }
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /***
         * 删除指定文件夹下所有文件
         *
         * @param path 文件夹完整绝对路径
         * @return
         */
        public static boolean delAllFile(String path) {
            boolean flag = false;
            File file = new File(path);
            if (!file.exists()) {
                return flag;
            }
            if (!file.isDirectory()) {
                return flag;
            }
            String[] tempList = file.list();
            File temp = null;
            for (int i = 0; i < tempList.length; i++) {
                if (path.endsWith(File.separator)) {
                    temp = new File(path + tempList[i]);
                } else {
                    temp = new File(path + File.separator + tempList[i]);
                }
                if (temp.isFile()) {
                    temp.delete();
                }
                if (temp.isDirectory()) {
                    delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
                    flag = true;
                }
            }
            return flag;
        }
    
    }
    
    

    具体业务代码

    注:
    1、对数据预处理

     		String title = "业主信息表";//这个是表格的标题,不是文件名
     		//每个单元格的标题,具体内容自己设置
            String[] rowsName = {"业主id", "姓名","身份证号","楼栋号", "单元号", "楼层号", "房间号", "电话号码"};
            //存放需要的数据
            ArrayList<Object[]> dataList = new ArrayList<>();
            Object[] objs = null;
            //根据业务需求,查询出要导出的数据
            List<CitRoomMaster> list = citRoomMasterService.getList();
            //将全部数据按需加载到dataList中
            //对null值进行一个处理,因为如果是空的导入文件中会造成整个文件损坏,读取不到任何数据
            for (CitRoomMaster c :list) {
                objs = new Object[rowsName.length];
                objs[0] = c.getId();
                objs[1] = c.getUsername() == null?"未录入":c.getUsername();
                objs[2] = c.getIdCard() == null?"未录入":c.getIdCard();
                objs[3] = c.getBuilding() == null?"未录入":c.getBuilding();
                objs[4] = c.getUnit() == null?"未录入":c.getUnit();
                objs[5] = c.getRoomLevel() == null?"未录入":c.getRoomLevel();
                objs[6] = c.getRoomNum() == null?"未录入":c.getRoomNum();
                objs[7] = c.getTel() == null?"未录入":c.getTel();
                dataList.add(objs);
            }
    

    2、按500条数据进行Excel文件生成

    // 将excel导出的文件位置,临时文件,注意,一定是一个不存在的文件,因为后面会把这个文件夹删完
            String filePath = "C:\\小区业主信息"+ File.separator;
            // 得到此路径下文件
            File fileDir = new File(filePath);
            //创建文件夹
            if (!fileDir.exists() && !fileDir.isDirectory()) {
                fileDir.mkdirs();
            }
            // 用于存放生成的excel文件名称
            List<String> fileNames = new ArrayList<String>();
            // 导出Excel文件的路径
            String fullFilePath = "";
            //输出流
            FileOutputStream os = null;
    //拿到整个需要循环导出的次数
            int length = list.size()%500 == 0 ? list.size()/500 : (list.size()/500)+1;
            for (int i = 0; i < length; i++) {
                //给文件命名。随机命名 自定义
                String fileName = "OwnerInformation-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
    //生成Excel文件导出的路径
                fullFilePath = filePath + File.separator + fileName;
                fileNames.add(fullFilePath);
                os = new FileOutputStream(fullFilePath);
                //调用poi的工具类
                int end = 0;
                //对list进行截取,每500条数据
                ExportExcel ex = new ExportExcel(title, rowsName, dataList.subList(i*500,end = (i+1)*500<=list.size()?(i+1)*500:list.size()));
                try {
                    ex.export(os);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                os.flush();
                os.close();
                os = null;
            }
    

    3、将存放Excel的文件夹压缩导出,就完成需求了

    //告诉浏览器数据格式,将头和数据传到前台
            String headStr = "attachment; filename=\"" + zip.getName() + "\"";
            response.setContentType("APPLICATION/zip");
    //        response.setHeader("Location",zip.getName());
            response.setHeader("Content-Disposition", headStr);
            OutputStream out = response.getOutputStream();
            InputStream in = new FileInputStream(zipFilePath);
            byte[] buffer = new byte[1024];
            int i = -1;
            while ((i = in.read(buffer)) != -1) {
                out.write(buffer, 0, i);
            }
            out.flush();
            out.close();
            in.close();
            out = null;
            try {
                excelUtil.delAllFile(filePath); // 删除完里面所有内容
                filePath = filePath.toString();
                java.io.File myFilePath = new java.io.File(filePath);
                myFilePath.delete(); // 删除空文件夹
            } catch (Exception e) {
                e.printStackTrace();
            }
    

    最后再说一点,还是关于中文乱码的问题,本来最开始的我是用的中文写文件名,并且在自己电脑上测试的时候是么有乱码的。但是部署到公司服务器上,就乱码了,怀疑是编码不一致问题导致的,因为时间问题,也没有去调试了。所以,如果有小伙伴能够解决这个问题,希望不吝赐教。

    展开全文
  • Java 各种pdf文档

    2017-10-09 12:58:43
    文档具体内容如下: Java Platform Standard Edition Deployment Guide.pdf Java Platform Standard Edition Installation Guide.pdf Java Platform Standard Edition Core Libraries.pdf Java Platform Standard ...
  • 文档记录的是通过java程序下载文件到指定路径的方法
  • Java-合并文档到一个文档Java程序-免费下载
  • 本项目为我现在负责开发的一个项目,在线程并发测试中可以支持200个,可能由于我电脑的配置问题,一般在并发大于200时client端可能会出现"阻塞"问题,还请大家指教
  • java 多文件压缩后下载(zip)

    千次阅读 2019-06-21 10:01:43
    说明:从服务器上读取文件流写入到zip流中后下载 本工具可以直接拿去使用 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletResponse; import java.io.*; ...

    说明:从服务器上读取文件流写入到zip流中后下载

    本工具可以直接拿去使用 

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.net.URLEncoder;
    import java.util.Map;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    /**
     * 文件压缩下载工具类
     * @author xsh
     */
    public class ZipUtil {
        private static Logger logger = LoggerFactory.getLogger(ZipUtil.class);
    
        /**
         * 多文件zip压缩下载 (说明:读取文件流到zip流中,之后下载)
         * @param response
         * @param downloadName  下载后的压缩包名,带后缀
         * @param map  存放文件信息的map ,key为该文件压缩后的目录层级路径如:/xxx/xxx/xxx.jpg,为文件名时则在压缩包的顶层
         *             如:xxx.jpg。 value为下载文件所在的路径
         */
        public static void MultiFileZipDownload(HttpServletResponse response,String downloadName,Map<String,String> map) {
            OutputStream outputStream = null;
            try {
                outputStream = response.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            ZipOutputStream zos=new ZipOutputStream(outputStream);
            try {
                response.setContentType("multipart/form-data");
                response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(downloadName, "UTF-8"));
                map.forEach((name,path)->{
                    InputStream is = null;
                    BufferedInputStream in = null;
                    byte[] buffer = new byte[1024];
                    int len;
                    //创建zip实体(一个文件对应一个ZipEntry)
                    //name --->压缩包的层级路径
                    ZipEntry entry = new ZipEntry(name);
                    try {
                        //获取需要下载的文件流
                        File file=new File(path);
                        is = new FileInputStream(file);
                        in = new BufferedInputStream(is);
                        zos.putNextEntry(entry);
                        //文件流循环写入ZipOutputStream
                        while ((len = in.read(buffer)) != -1 ) {
                            zos.write(buffer, 0, len);
                        }
                    } catch (Exception e) {
                        logger.info("下载全部附件--压缩文件出错",e);
                    }finally {
                        if(entry != null) {
                            try {
                                zos.closeEntry();
                            } catch (Exception e) {
                                logger.info("下载全部附件--zos实体关闭失败",e);
                            }
                        }
                        if(in != null) {
                            try {
                                in.close();
                            } catch (Exception e) {
                                logger.info("下载全部附件--文in流关闭失败",e);
                            }
                        }
                        if(is != null) {
                            try {
                                is.close();
                            }catch (Exception e) {
                                logger.info("下载全部附件-is流关闭失败",e);
                            }
                        }
                    }
                });
            } catch (IOException e) {
                logger.error(e.getMessage());
            }finally {
                if(zos != null) {
                    try {
                        zos.close();
                    } catch (Exception e2) {
                        logger.info("关闭zos流时出现错误{}",e2);
                    }
                }
                if(outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (Exception e2) {
                        logger.info("关闭outputStream时出现错误{}",e2);
                    }
                }
    
            }
        }
    }
    解决火狐乱码:
    response.setHeader("Content-Disposition", "attachment;fileName=" +  new String(downloadName.getBytes(),"iso-8859-1"));

     

    兼容写法
    
     String userAgent = request.getHeader("user-agent").toLowerCase();
                if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {
                    // win10 ie edge 浏览器 和其他系统的ie
                     response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(downloadName, "UTF-8"));
                } else {
                    // 其他浏览器
                   response.setHeader("Content-Disposition", "attachment;fileName=" +  new String(downloadName.getBytes(),"iso-8859-1"));
                }
    
    
    

     

    展开全文
  • JavaAPI文档中文版

    2018-05-23 17:17:19
    JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI文档中文版,JavaAPI...
  • Java实现文件下载功能

    2012-02-25 18:03:13
    Java实现文件下载功能,以WORD文档方式展现给用户看。
  • java的ftp线程下载

    热门讨论 2014-10-02 20:42:47
    本程序是在原有基础上逐步完善的,第一版:...详细文档请看: http://www.open-open.com/home/space.php?uid=183&do=blog&id=8799 本程序很适合在主机间批量传输文件和目录,参数可控
  • java多文件压缩成zip文件并实现下载

    热门讨论 2012-10-25 19:40:27
    本例是把文件压缩成一个zip文件,然后下载到本地。 项目完整,下载解压即可运行。
  • Eclipse下完整的java程序,包含HttpClient的全部jar包。通过java文件,实现通过链接将文件下载本地
  • Java多线程下载文件实例

    千次阅读 2018-09-04 10:07:52
    import java.io.BufferedInputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.uti....
  • javaAPI 官方文档 中文版 良心!
  • Java多线程下载文件

    万次阅读 热门讨论 2017-08-03 10:03:08
    Java多线程下载文件优化:合理利用服务器资源,将资源利用最大化,加快下载速度一般有两种方式: 线程池里面有N个线程,线程下载单个文件,将网络路径的文件流切割成快,每个线程下载一小部分,然后写入到文件...
  • http://blog.csdn.net/r3lish/article/details/51912543 进度条:78%[===================> ]97.7K/s, will be finished in 75.59s 限速、文件网络地址、文件本地路径,均可在代码里修改。
  • java实现文件下载,并弹出保存对话框(Excel)
  • java多文件压缩打包成zip下载

    万次阅读 2018-12-21 14:53:53
    java多文件压缩打包成zip下载 如果实现批量操作一些文件,使之压缩打包成zip下载? 具体实现步骤如下: 设置下载文件名编码 创建zip输出流ZipOutputStream 将需要下载文件流循环写入ZipOutputStream 关闭各个流...
  • Java下载文件的几种方式

    千次阅读 2021-03-05 19:04:41
    1.以流的方式下载.public HttpServletResponse download(String path, HttpServletResponse response) {try {// path是指欲下载文件的路径。File file = new File(path);// 取得文件名。String filename = file....
  • Java多线程使用线程池实现文件下载

    千次阅读 2018-11-21 11:08:35
    线程下载原理: 1、基本思路是将文件分段切割、分段传输、分段保存。 2、分段切割用到HttpUrlConnection对象的setRequestProperty(“Range”, “bytes=” + start + “-” + end)方法。 3、分段传输用到...
  • Java文件下载的几种方式
  • ========使用java代码生成json文件和word文档!=======
  • JAVA生成pdf文件

    2017-03-09 16:24:04
    java生成pdf文件
  • java访问https网址下载文件

    热门讨论 2013-10-18 20:01:05
    java访问https网址下载文件,当网页需要下载证书的时候,代码和操作步骤齐全。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,214,202
精华内容 485,680
关键字:

java多文件下载

java 订阅