日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【zip导出】下载导出包含图片,excel,pdf的zip压缩包

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【zip导出】下载导出包含图片,excel,pdf的zip压缩包 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

工具類

package com.sapit.compensation.moudle;import java.awt.Color; import java.awt.Rectangle; import java.awt.geom.Rectangle2D; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.sl.usermodel.PictureData.PictureType; import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XSLFPictureData; import org.apache.poi.xslf.usermodel.XSLFPictureShape; import org.apache.poi.xslf.usermodel.XSLFSlide; import org.apache.poi.xslf.usermodel.XSLFTextBox; import org.apache.poi.xslf.usermodel.XSLFTextParagraph; import org.apache.poi.xslf.usermodel.XSLFTextRun; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSONObject; import com.sapit.compensation.common.util.Base64Util; import com.sapit.compensation.common.util.FileUtilsExt; import com.sapit.compensation.common.util.TimestampTool; import com.sapit.compensation.common.util.ZipUtils; import com.sapit.compensation.moudle.business.architectureAnalysis.SchemeAnalysis; import com.sapit.compensation.moudle.business.data.CompensationAnalysis;/*** <p>文件名稱: DownloadEcharsAndData.java </p> * <p>類型描述: [分析頁(yè)面下載功能] </p>* <p>創(chuàng)建時(shí)間: 2022年5月23日 </p>* @author jlk* @version V1.0*/ public class DownloadEcharsAndData {private static Logger logger = LoggerFactory.getLogger(com.sapit.compensation.common.util.FileUtilsExt.class);/*** @Description: 下載zip* @param <map>* @param <HttpServletResponse>* @Author:jlk* @CreateTime:2022-05-24* @throws IOException */@SuppressWarnings("all")public static void downloadZip(HashMap map, HttpServletRequest request, HttpServletResponse response) throws IOException {String path = request.getSession().getServletContext().getRealPath("upload");String fileName = UUID.randomUUID().toString();File file = new File(path + File.separator + fileName);response.setContentType("application/zip");response.setCharacterEncoding("utf-8");response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(map.get("name").toString(), "UTF-8"));OutputStream outs = response.getOutputStream();try {if (file.mkdirs()) {logger.debug("生成文件夾成功", file.toString());}//excel生成String excelPath = "";//initCellMaxTextLength();if (map.get("customerPositionClass") != null) {excelPath = writeExcelCustomerPositionClass(file, map);} else {excelPath = writeExcel(file, map);}//轉(zhuǎn)碼圖片List<String> imgPathList = base64ToJpg(file, map);//打包zipList<File> fileList = new ArrayList<>();if (CollectionUtils.isNotEmpty(imgPathList)) {for (int i = 0; i < imgPathList.size(); i++) {fileList.add(new File(imgPathList.get(i)));}}if (StringUtils.isNoneBlank(excelPath))fileList.add(new File(excelPath));ZipUtils.toZip(fileList, outs);} catch (Exception e) {logger.debug("錯(cuò)誤", e);} finally {outs.flush();outs.close();FileUtilsExt.delFile(file.toString());}}/*** @Description: base64轉(zhuǎn)換jpg* @param <File>* @param <HashMap>* @throws IOException * @Author:jlk* @CreateTime:2022-05-24*/@SuppressWarnings("all")public static List<String> base64ToJpg(File file, HashMap map) throws IOException {List<String> imgPathList = new ArrayList<String>();if (map.get("baseImg") != null) {List<String> imgList = (List<String>) map.get("baseImg");for (int i = 0; i < imgList.size(); i++) {String base64 = imgList.get(i);if (StringUtils.isNotBlank(base64)) {String imgPathName = file.toString() + File.separator + map.get("name") + "_圖表_" + i;String imgPath = Base64Util.generateImage(base64, imgPathName);imgPathList.add(imgPath);}}return imgPathList;}return imgPathList;}/*** @Description: excel* @param <File>* @param <HashMap>* @Author:jlk* @CreateTime:2022-05-24*/@SuppressWarnings("all")public static String writeExcel(File file, HashMap map) throws IOException {//服務(wù)器路徑+文件名String excelPath = file.toString() + file.separator + map.get("name") + ".xlsx";FileOutputStream fout = new FileOutputStream(excelPath);try {//獲取數(shù)據(jù)源List<List<String>> dataList = (List<List<String>>) map.get("dataList");List<List<String>> colorList = (List<List<String>>) map.get("colorList");List<List<String>> titleList = (List<List<String>>) map.get("titleList");List<List<String>> echarsList = (List<List<String>>) map.get("echarsList");List<List<String>> dataRatioList = (List<List<String>>) map.get("dataRatioList");List<List<String>> colorRatioList = (List<List<String>>) map.get("colorRatioList");//創(chuàng)建excelXSSFWorkbook wb = new XSSFWorkbook();XSSFRow row = null;XSSFCell cell = null;// 創(chuàng)建新的sheet對(duì)象(excel的表單) 并設(shè)置sheet名字XSSFSheet sheet = wb.createSheet(map.get("name").toString());sheet.setDefaultRowHeightInPoints(20);sheet.setDefaultColumnWidth(12);XSSFCellStyle titleStyle = getTitleStyle(wb);XSSFCellStyle echarsStyle = getEcharsStyle(wb);XSSFCellStyle cellNoColorStyle = getNoColorStyle(wb);Font cellFont = wb.createFont();cellFont.setItalic(false); // 設(shè)置字體為斜體字 cellFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為9px cellFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 cellNoColorStyle.setFont(cellFont);cellNoColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行// ------------------處理數(shù)據(jù)/start---------------------//表頭int rowNum = 0;if (CollectionUtils.isNotEmpty(titleList)) {for (int i = 0; i < titleList.size(); i++) {int MergedCount = 0;int beginIndex = 0;int endIndex = 0;row = sheet.createRow(rowNum);rowNum++;List<String> titles = titleList.get(i);for (int j = 0; j < titles.size(); j++) {String content = titles.get(j);cell = row.createCell(j);cell.setCellValue("" + content + "");cell.setCellStyle(titleStyle);if (j > 0 && j < titles.size()) {if (content.equals(titles.get(j - 1)) && StringUtils.isNotBlank(content)) {MergedCount++;if (MergedCount == 1) {beginIndex = j - 1;}if (j == titles.size() - 1) {endIndex = j;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));}} else if (!content.equals(titles.get(j - 1)) && MergedCount > 0 && j == titles.size() - 1) {endIndex = j - 1;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));}}if (i > 0 && i < titleList.size()) {String contentRow = titleList.get(i - 1).get(j);if (i > 0 && i < titleList.size() && contentRow.equals(titles.get(j))) {sheet.addMergedRegion(new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), j, j));}}}}}//表格數(shù)據(jù)if (CollectionUtils.isNotEmpty(colorList)) {for (int i = 0; i < dataList.size(); i++) {row = sheet.createRow(rowNum);rowNum++;List<String> rowColorList = colorList.get(i);List<String> rowList = dataList.get(i);for (int j = 0; j < rowList.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + rowList.get(j) + "");XSSFCellStyle cellColorStyle = wb.createCellStyle();String color = rowColorList.get(j);cellColorStyle.setAlignment(HorizontalAlignment.CENTER);cellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellColorStyle.setBorderBottom(BorderStyle.THIN);//下邊框 cellColorStyle.setBorderLeft(BorderStyle.THIN);//左邊框 cellColorStyle.setBorderRight(BorderStyle.THIN);//右邊框 cellColorStyle.setBorderTop(BorderStyle.THIN);//上邊框cellColorStyle.setFont(cellFont);cellColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行cellColorStyle.setFillForegroundColor(new XSSFColor(new Color(colorToFloat(color)[0], colorToFloat(color)[1], colorToFloat(color)[2])));cellColorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(cellColorStyle);}}} else {for (int i = 0; i < dataList.size(); i++) {row = sheet.createRow(rowNum);rowNum++;List<String> rowList = dataList.get(i);for (int j = 0; j < rowList.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + rowList.get(j) + "");cell.setCellStyle(cellNoColorStyle);}}}if (CollectionUtils.isNotEmpty(dataRatioList)) {rowNum = rowNum + 5;if (CollectionUtils.isNotEmpty(titleList)) {for (int i = 0; i < titleList.size(); i++) {int MergedCount = 0;int beginIndex = 0;int endIndex = 0;row = sheet.createRow(rowNum);rowNum++;List<String> titles = titleList.get(i);for (int j = 0; j < titles.size(); j++) {String content = titles.get(j);cell = row.createCell(j);cell.setCellValue("" + content + "");cell.setCellStyle(titleStyle);if (j > 0 && j < titles.size()) {if (content.equals(titles.get(j - 1)) && StringUtils.isNotBlank(content)) {MergedCount++;if (MergedCount == 1) {beginIndex = j - 1;}if (j == titles.size() - 1) {endIndex = j;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));}} else if (!content.equals(titles.get(j - 1)) && MergedCount > 0 && j == titles.size() - 1) {endIndex = j - 1;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));}}if (i > 0 && i < titleList.size()) {String contentRow = titleList.get(i - 1).get(j);if (i > 0 && i < titleList.size() && contentRow.equals(titles.get(j))) {sheet.addMergedRegion(new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), j, j));}}}}}//表格二數(shù)據(jù)if (CollectionUtils.isNotEmpty(colorRatioList)) {for (int i = 0; i < dataRatioList.size(); i++) {row = sheet.createRow(rowNum);rowNum++;List<String> rowColorList = colorRatioList.get(i);List<String> rowList = dataRatioList.get(i);for (int j = 0; j < rowList.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + rowList.get(j) + "");XSSFCellStyle cellColorStyle = wb.createCellStyle();String color = rowColorList.get(j);cellColorStyle.setAlignment(HorizontalAlignment.CENTER);cellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellColorStyle.setBorderBottom(BorderStyle.THIN);//下邊框 cellColorStyle.setBorderLeft(BorderStyle.THIN);//左邊框 cellColorStyle.setBorderRight(BorderStyle.THIN);//右邊框 cellColorStyle.setBorderTop(BorderStyle.THIN);//上邊框cellColorStyle.setFont(cellFont);cellColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行cellColorStyle.setFillForegroundColor(new XSSFColor(new Color(colorToFloat(color)[0], colorToFloat(color)[1], colorToFloat(color)[2])));cellColorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(cellColorStyle);}}} else {for (int i = 0; i < dataRatioList.size(); i++) {row = sheet.createRow(rowNum);rowNum++;List<String> rowList = dataRatioList.get(i);for (int j = 0; j < rowList.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + rowList.get(j) + "");cell.setCellStyle(cellNoColorStyle);}}}}//echars數(shù)據(jù)if (rowNum != 0) {rowNum = rowNum + 5;}if (CollectionUtils.isNotEmpty(echarsList)) {for (int i = 0; i < echarsList.size(); i++) {List<String> echars = echarsList.get(i);if (CollectionUtils.isNotEmpty(echars)) {for (int j = 0; j < echars.size(); j++) {row = sheet.createRow(rowNum);String content = echars.get(j);if (StringUtils.isNoneBlank(content)) {int max = 32767;int len = content.length();int num = content.length() / max;for (int k = 0; k <= num; k++) {if (k == num) {cell = row.createCell(k);cell.setCellValue("" + content.substring(k * max, len) + "");cell.setCellStyle(echarsStyle);} else {cell = row.createCell(k);cell.setCellValue("" + content.substring(k * max, (k + 1) * max) + "");cell.setCellStyle(echarsStyle);}}}rowNum++;}}}}// ------------------處理數(shù)據(jù)end--------------------------------------wb.write(fout);fout.close();} catch (Exception e) {e.printStackTrace();} finally {}return excelPath;}/*** @Description: rgb顏色值轉(zhuǎn)換* @param <String>* @Author:jlk* @CreateTime:2022-05-24*/@SuppressWarnings("all")public static Integer[] colorToFloat(String color) {Integer[] rgb = Arrays.stream(color.split(",")).map(s -> {s = s.trim();return Integer.parseInt(s);}).toArray(Integer[]::new);return rgb;}/*** @Description: 下載PPT* @param <map>* @param <HttpServletResponse>* @Author:jlk* @CreateTime:2022-05-24* @throws IOException */@SuppressWarnings("all")public static void downloadPPT(String customerName, List<CompensationAnalysis> CompensationAnalysisList, HttpServletRequest request,HttpServletResponse response) throws IOException {String path = request.getSession().getServletContext().getRealPath("upload");String fileName = UUID.randomUUID().toString();File file = new File(path + File.separator + fileName);if (file.mkdirs()) {logger.debug("生成文件夾成功", file.toString());}response.reset();response.setContentType("application/zip");response.setCharacterEncoding("utf-8");response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(customerName + "_薪酬分析圖表_" + TimestampTool.getDate(new Date()), "UTF-8"));OutputStream outs = response.getOutputStream();//創(chuàng)建pptXMLSlideShow ppt = new XMLSlideShow();File pptPath = new File(file + File.separator + customerName + "_薪酬分析圖表_" + TimestampTool.getDate(new Date()) + ".pptx");Map<Integer, String> dataMap = new HashMap<>();FileOutputStream pptbaos = new FileOutputStream(pptPath);//創(chuàng)建excelXSSFWorkbook wb = new XSSFWorkbook();File excelPath = new File(file + File.separator + customerName + "_薪酬分析圖表_" + TimestampTool.getDate(new Date()) + ".xlsx");FileOutputStream excelbaos = new FileOutputStream(excelPath);boolean isppt = false;boolean isexcel = false;try {for (int j = 0; j < CompensationAnalysisList.size(); j++) {String base64 = CompensationAnalysisList.get(j).getAnalysisImage();String data = CompensationAnalysisList.get(j).getAnalysisData();String name = CompensationAnalysisList.get(j).getAnalysisTopicName();if (StringUtils.isNotBlank(base64)) {XSLFSlide slide = ppt.createSlide();XSLFTextBox shape1 = slide.createTextBox();Rectangle anchor = new Rectangle(30, 30, 300, 50);shape1.setAnchor(anchor);XSLFTextParagraph p1 = shape1.addNewTextParagraph();XSLFTextRun r1 = p1.addNewTextRun();r1.setFontSize(14.00);r1.setFontColor(Color.black);//shape1.setFillColor(Color.red); r1.setText(name);// 圖片文件String imgPathName = file.toString() + File.separator + CompensationAnalysisList.get(j).getAnalysisTopicName();String imgPath = Base64Util.generateImage(base64, imgPathName);File image = new File(imgPath);//測(cè)試用本地圖片//File image = new File("E://plief.jpg");// 圖片文件輸入流FileInputStream imageFis = new FileInputStream(image);// 獲取圖片大小int len = (int) image.length();// 創(chuàng)建一個(gè)字節(jié)數(shù)組,數(shù)組大小與圖片文件大小一致byte[] imageData = new byte[len];// 將圖片數(shù)據(jù)讀進(jìn)字節(jié)數(shù)組中int pictureData = imageFis.read(imageData);// 將圖片添加到PPT中XSLFPictureData pd = ppt.addPicture(imageData, PictureType.PNG);// 將圖片放到指定的幻燈片中XSLFPictureShape pic = slide.createPicture(pd);// 設(shè)置圖片框的放置的位置和大小pic.setAnchor(new Rectangle2D.Double(100, 160, 520, 200));isppt = true;imageFis.close();}if (StringUtils.isNotBlank(data)) {JSONObject object = JSONObject.parseObject(data);writeExcel(object, wb);isexcel = true;}}ppt.write(pptbaos);wb.write(excelbaos);List<File> fileList = new ArrayList<>();if (isppt)fileList.add(pptPath);if (isexcel)fileList.add(excelPath);ZipUtils.toZip(fileList, outs);} catch (Exception e) {logger.debug("錯(cuò)誤", e);} finally {pptbaos.flush();pptbaos.close();excelbaos.flush();excelbaos.close();outs.flush();outs.close();FileUtilsExt.delFile(file.toString());}}public static byte[] File2byte(File tradeFile) {byte[] buffer = null;try {FileInputStream fis = new FileInputStream(tradeFile);ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] b = new byte[1024];int n;while ((n = fis.read(b)) != -1) {bos.write(b, 0, n);}fis.close();bos.close();buffer = bos.toByteArray();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return buffer;}public static XSLFSlide copySlide(XSLFSlide slide) {XSLFSlide newSlide = slide.getSlideShow().createSlide(slide.getSlideLayout());newSlide.appendContent(slide);return newSlide;}/*** @Description: excel* @param <File>* @param <HashMap>* @Author:jlk* @CreateTime:2022-05-24*/@SuppressWarnings("all")public static XSSFWorkbook writeExcel(JSONObject jsonObject, XSSFWorkbook wb) throws IOException {try {//獲取數(shù)據(jù)源List<List<String>> dataList = (List<List<String>>) jsonObject.get("dataList");List<List<String>> colorList = (List<List<String>>) jsonObject.get("colorList");List<List<String>> titleList = (List<List<String>>) jsonObject.get("titleList");List<List<String>> echarsList = (List<List<String>>) jsonObject.get("echarsList");List<List<String>> dataRatioList = (List<List<String>>) jsonObject.get("dataRatioList");List<List<String>> colorRatioList = (List<List<String>>) jsonObject.get("colorRatioList");XSSFRow row = null;XSSFCell cell = null;// 創(chuàng)建新的sheet對(duì)象(excel的表單) 并設(shè)置sheet名字XSSFSheet sheet = wb.createSheet(jsonObject.get("name").toString());sheet.setDefaultRowHeightInPoints(20);sheet.setDefaultColumnWidth(12);XSSFCellStyle titleStyle = getTitleStyle(wb);XSSFCellStyle echarsStyle = getEcharsStyle(wb);XSSFCellStyle cellNoColorStyle = getNoColorStyle(wb);Font cellFont = wb.createFont();cellFont.setItalic(false); // 設(shè)置字體為斜體字 cellFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為9px cellFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 cellNoColorStyle.setFont(cellFont);cellNoColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行// ------------------處理數(shù)據(jù)/start---------------------//表頭int rowNum = 0;if (CollectionUtils.isNotEmpty(titleList)) {for (int i = 0; i < titleList.size(); i++) {int MergedCount = 0;int beginIndex = 0;int endIndex = 0;row = sheet.createRow(rowNum);rowNum++;List<String> titles = titleList.get(i);for (int j = 0; j < titles.size(); j++) {String content = titles.get(j);cell = row.createCell(j);cell.setCellValue("" + content + "");cell.setCellStyle(titleStyle);if (j > 0 && j < titles.size()) {if (content.equals(titles.get(j - 1)) && StringUtils.isNotBlank(content)) {MergedCount++;if (MergedCount == 1) {beginIndex = j - 1;}if (j == titles.size() - 1) {endIndex = j;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));}} else if (!content.equals(titles.get(j - 1)) && MergedCount > 0 && j == titles.size() - 1) {endIndex = j - 1;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));}}if (i > 0 && i < titleList.size()) {String contentRow = titleList.get(i - 1).get(j);if (i > 0 && i < titleList.size() && contentRow.equals(titles.get(j))) {sheet.addMergedRegion(new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), j, j));}}}}}//表格數(shù)據(jù)if (CollectionUtils.isNotEmpty(colorList)) {for (int i = 0; i < dataList.size(); i++) {row = sheet.createRow(rowNum);rowNum++;List<String> rowColorList = colorList.get(i);List<String> rowList = dataList.get(i);for (int j = 0; j < rowList.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + rowList.get(j) + "");XSSFCellStyle cellColorStyle = wb.createCellStyle();String color = rowColorList.get(j);cellColorStyle.setAlignment(HorizontalAlignment.CENTER);cellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellColorStyle.setBorderBottom(BorderStyle.THIN);//下邊框 cellColorStyle.setBorderLeft(BorderStyle.THIN);//左邊框 cellColorStyle.setBorderRight(BorderStyle.THIN);//右邊框 cellColorStyle.setBorderTop(BorderStyle.THIN);//上邊框cellColorStyle.setFont(cellFont);cellColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行cellColorStyle.setFillForegroundColor(new XSSFColor(new Color(colorToFloat(color)[0], colorToFloat(color)[1], colorToFloat(color)[2])));cellColorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(cellColorStyle);}}} else {for (int i = 0; i < dataList.size(); i++) {row = sheet.createRow(rowNum);rowNum++;List<String> rowList = dataList.get(i);for (int j = 0; j < rowList.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + rowList.get(j) + "");cell.setCellStyle(cellNoColorStyle);}}}if (CollectionUtils.isNotEmpty(dataRatioList)) {rowNum = rowNum + 5;if (CollectionUtils.isNotEmpty(titleList)) {for (int i = 0; i < titleList.size(); i++) {int MergedCount = 0;int beginIndex = 0;int endIndex = 0;row = sheet.createRow(rowNum);rowNum++;List<String> titles = titleList.get(i);for (int j = 0; j < titles.size(); j++) {String content = titles.get(j);cell = row.createCell(j);cell.setCellValue("" + content + "");cell.setCellStyle(titleStyle);if (j > 0 && j < titles.size()) {if (content.equals(titles.get(j - 1)) && StringUtils.isNotBlank(content)) {MergedCount++;if (MergedCount == 1) {beginIndex = j - 1;}if (j == titles.size() - 1) {endIndex = j;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));}} else if (!content.equals(titles.get(j - 1)) && MergedCount > 0 && j == titles.size() - 1) {endIndex = j - 1;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), beginIndex, endIndex));}}if (i > 0 && i < titleList.size()) {String contentRow = titleList.get(i - 1).get(j);if (i > 0 && i < titleList.size() && contentRow.equals(titles.get(j))) {sheet.addMergedRegion(new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), j, j));}}}}}//表格二數(shù)據(jù)if (CollectionUtils.isNotEmpty(colorRatioList)) {for (int i = 0; i < dataRatioList.size(); i++) {row = sheet.createRow(rowNum);rowNum++;List<String> rowColorList = colorRatioList.get(i);List<String> rowList = dataRatioList.get(i);for (int j = 0; j < rowList.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + rowList.get(j) + "");XSSFCellStyle cellColorStyle = wb.createCellStyle();String color = rowColorList.get(j);cellColorStyle.setAlignment(HorizontalAlignment.CENTER);cellColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellColorStyle.setBorderBottom(BorderStyle.THIN);//下邊框 cellColorStyle.setBorderLeft(BorderStyle.THIN);//左邊框 cellColorStyle.setBorderRight(BorderStyle.THIN);//右邊框 cellColorStyle.setBorderTop(BorderStyle.THIN);//上邊框cellColorStyle.setFont(cellFont);cellColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行cellColorStyle.setFillForegroundColor(new XSSFColor(new Color(colorToFloat(color)[0], colorToFloat(color)[1], colorToFloat(color)[2])));cellColorStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(cellColorStyle);}}} else {for (int i = 0; i < dataRatioList.size(); i++) {row = sheet.createRow(rowNum);rowNum++;List<String> rowList = dataRatioList.get(i);for (int j = 0; j < rowList.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + rowList.get(j) + "");cell.setCellStyle(cellNoColorStyle);}}}}//echars數(shù)據(jù)if (rowNum != 0) {rowNum = rowNum + 5;}if (CollectionUtils.isNotEmpty(echarsList)) {for (int i = 0; i < echarsList.size(); i++) {List<String> echars = echarsList.get(i);if (CollectionUtils.isNotEmpty(echars)) {for (int j = 0; j < echars.size(); j++) {row = sheet.createRow(rowNum);//單元格超32767報(bào)錯(cuò)問題修改String content = echars.get(j);if (StringUtils.isNoneBlank(content)) {int max = 32767;int len = content.length();int num = content.length() / max;for (int k = 0; k <= num; k++) {if (k == num) {cell = row.createCell(k);cell.setCellValue("" + content.substring(k * max, len) + "");cell.setCellStyle(echarsStyle);} else {cell = row.createCell(k);cell.setCellValue("" + content.substring(k * max, (k + 1) * max) + "");cell.setCellStyle(echarsStyle);}}}rowNum++;}}}}// ------------------處理數(shù)據(jù)end--------------------------------------} catch (Exception e) {logger.debug("錯(cuò)誤", e);} finally {}return wb;}/*** @Description: 職級(jí)圖excel* @param <File>* @param <HashMap>* @Author:jlk* @CreateTime:2022-05-24*/@SuppressWarnings("all")public static String writeExcelCustomerPositionClass(File file, HashMap map) throws IOException {//服務(wù)器路徑+文件名String excelPath = file.toString() + file.separator + map.get("name") + ".xlsx";FileOutputStream fout = new FileOutputStream(excelPath);try {//獲取數(shù)據(jù)源List<Map> dataList = (List<Map>) map.get("dataList");List<Map> titleList = (List<Map>) map.get("titleList");//創(chuàng)建excelXSSFWorkbook wb = new XSSFWorkbook();XSSFRow row = null;XSSFCell cell = null;// 創(chuàng)建新的sheet對(duì)象(excel的表單) 并設(shè)置sheet名字XSSFSheet sheet = wb.createSheet(map.get("name").toString());sheet.setDefaultRowHeightInPoints(20);sheet.setDefaultColumnWidth(12);XSSFCellStyle titleStyle = getTitleStyle(wb);XSSFCellStyle cellNoColorStyle = getNoColorStyle(wb);// ------------------處理數(shù)據(jù)/start---------------------//表頭int rowNum = 0;List headTitles = new ArrayList();if (CollectionUtils.isNotEmpty(titleList)) {row = sheet.createRow(rowNum);XSSFRow rowSecondLevel = sheet.createRow(rowNum + 1);XSSFCell cellSecondLevel = null;int cellBegin = 0;int cellEnd = 0;for (int i = 0; i < titleList.size(); i++) {Map titles = (Map) titleList.get(i);if ("customerPositionClass.text".equals(titles.get("dataIndex"))) {String title = (String) titles.get("title");cell = row.createCell(i);cell.setCellValue("" + title + "");sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum() + 1, i, i));cell.setCellStyle(titleStyle);cellBegin = cellBegin + 1;headTitles.add(titles.get("dataIndex"));cellSecondLevel = rowSecondLevel.createCell(i);cellSecondLevel.setCellStyle(titleStyle);} else if ("mercerPositionClass.text".equals(titles.get("dataIndex"))) {String title = (String) titles.get("title");cell = row.createCell(i);cell.setCellValue("" + title + "");sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum() + 1, i, i));cell.setCellStyle(titleStyle);cellBegin = cellBegin + 1;headTitles.add(titles.get("dataIndex"));cellSecondLevel = rowSecondLevel.createCell(i);cellSecondLevel.setCellStyle(titleStyle);} else {String title = (String) titles.get("title");cell = row.createCell(cellBegin);cell.setCellValue("" + title + "");cell.setCellStyle(titleStyle);List<Map> childrenList = (List<Map>) titles.get("children");if (CollectionUtils.isNotEmpty(childrenList)) {for (int j = 0; j < childrenList.size(); j++) {String titleSecondLevel = (String) childrenList.get(j).get("title");cell = rowSecondLevel.createCell(cellBegin + j);cell.setCellValue("" + titleSecondLevel + "");cell.setCellStyle(titleStyle);headTitles.add((String) childrenList.get(j).get("dataIndex"));}if (childrenList.size() > 1) {cellEnd = cellBegin + childrenList.size() - 1;sheet.addMergedRegion(new CellRangeAddress(row.getRowNum(), row.getRowNum(), cellBegin, cellEnd));cellBegin = cellEnd + 1;} else {cellBegin = cellBegin + 1;}}}}rowNum = rowNum + 2;if (CollectionUtils.isNotEmpty(dataList)) {for (int i = 0; i < dataList.size(); i++) {row = sheet.createRow(rowNum);Map dataMap = dataList.get(i);for (int j = 0; j < headTitles.size(); j++) {String key = headTitles.get(j).toString();String data = (String) dataMap.get(key.substring(0, key.lastIndexOf(".")));if (StringUtils.isBlank(data)) {data = "";}cell = row.createCell(j);cell.setCellValue("" + data + "");cell.setCellStyle(cellNoColorStyle);}rowNum++;}}}// ------------------處理數(shù)據(jù)end--------------------------------------wb.write(fout);fout.close();} catch (Exception e) {logger.debug("錯(cuò)誤", e);} finally {}return excelPath;}public static XSSFCellStyle getTitleStyle(XSSFWorkbook wb) {//----------------表頭格樣式----------------------------------XSSFCellStyle titleStyle = wb.createCellStyle(); //表格樣式titleStyle.setAlignment(HorizontalAlignment.CENTER);titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);titleStyle.setBorderBottom(BorderStyle.THIN);//下邊框 titleStyle.setBorderLeft(BorderStyle.THIN);//左邊框 titleStyle.setBorderRight(BorderStyle.THIN);//右邊框 titleStyle.setBorderTop(BorderStyle.THIN);//上邊框titleStyle.setFillForegroundColor(new XSSFColor(new Color(135, 192, 178)));titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);Font ztFont = wb.createFont();ztFont.setItalic(false); // 設(shè)置字體為斜體字 //ztFont.setColor(HSSFColor.WHITE.index); // 設(shè)置字體顏色-白色 ztFont.setColor(Font.COLOR_NORMAL);ztFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為10px ztFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 ztFont.setBold(true); //加粗titleStyle.setFont(ztFont);//titleStyle.setWrapText(true);//設(shè)置自動(dòng)換行//----------------------------------------------------------return titleStyle;}public static XSSFCellStyle getEcharsStyle(XSSFWorkbook wb) {//----------------Echars格樣式----------------------------------XSSFCellStyle echarsStyle = wb.createCellStyle(); //表格樣式//echarsStyle.setAlignment(HorizontalAlignment.CENTER);//echarsStyle.setVerticalAlignment(VerticalAlignment.CENTER);Font echarsFont = wb.createFont();echarsFont.setItalic(false); // 設(shè)置字體為斜體字 echarsFont.setColor(Font.COLOR_NORMAL); // 設(shè)置字體顏色echarsFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為10px echarsFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 echarsFont.setBold(false); //加粗echarsStyle.setFont(echarsFont);//echarsStyle.setWrapText(true);//設(shè)置自動(dòng)換行//----------------------------------------------------------return echarsStyle;}public static XSSFCellStyle getNoColorStyle(XSSFWorkbook wb) {//----------------無色普通格樣式----------------------------------XSSFCellStyle cellNoColorStyle = wb.createCellStyle();cellNoColorStyle.setAlignment(HorizontalAlignment.CENTER);cellNoColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellNoColorStyle.setBorderBottom(BorderStyle.THIN);//下邊框 cellNoColorStyle.setBorderLeft(BorderStyle.THIN);//左邊框 cellNoColorStyle.setBorderRight(BorderStyle.THIN);//右邊框 cellNoColorStyle.setBorderTop(BorderStyle.THIN);//上邊框Font cellFont = wb.createFont();cellFont.setItalic(false); // 設(shè)置字體為斜體字 cellFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為9px cellFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 cellNoColorStyle.setFont(cellFont);cellNoColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行//----------------------------------------------------------return cellNoColorStyle;}/*** 初始化 cell 內(nèi)容長(zhǎng)度* cell 原本內(nèi)容長(zhǎng)度限制 32767 現(xiàn)修改為Integer.MAX_VALUE* 未使用*/public static void initCellMaxTextLength() {SpreadsheetVersion excel2007 = SpreadsheetVersion.EXCEL2007;if (Integer.MAX_VALUE != excel2007.getMaxTextLength()) {Field field;try {field = excel2007.getClass().getDeclaredField("_maxTextLength");field.setAccessible(true);field.set(excel2007, Integer.MAX_VALUE);} catch (Exception e) {e.printStackTrace();}}}/*** @Description: excel* @param <File>* @param <HashMap>* @Author:jlk* @CreateTime:2022-05-24*/@SuppressWarnings("all")public static void exportExcelForPreviewCheck(HashMap map, HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode("方案預(yù)覽校驗(yàn)表", "UTF-8"));OutputStream outs = response.getOutputStream();try {//獲取數(shù)據(jù)源List<Map> columns = (List<Map>) map.get("columns");List<List<String>> data = (List<List<String>>) map.get("data");//創(chuàng)建excelHSSFWorkbook wb = new HSSFWorkbook();HSSFRow row = null;HSSFCell cell = null;// 創(chuàng)建新的sheet對(duì)象(excel的表單) 并設(shè)置sheet名字HSSFSheet sheet = wb.createSheet("方案預(yù)覽校驗(yàn)");sheet.setDefaultRowHeightInPoints(20);sheet.setDefaultColumnWidth(14);HSSFCellStyle cellNoColorStyle = wb.createCellStyle();cellNoColorStyle.setAlignment(HorizontalAlignment.CENTER);cellNoColorStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellNoColorStyle.setBorderBottom(BorderStyle.THIN);//下邊框 cellNoColorStyle.setBorderLeft(BorderStyle.THIN);//左邊框 cellNoColorStyle.setBorderRight(BorderStyle.THIN);//右邊框 cellNoColorStyle.setBorderTop(BorderStyle.THIN);//上邊框Font cellFont = wb.createFont();cellFont.setItalic(false); // 設(shè)置字體為斜體字 cellFont.setFontHeightInPoints((short) 10); // 將字體大小設(shè)置為9px cellFont.setFontName("宋體"); // 字體應(yīng)用到當(dāng)前單元格上 cellNoColorStyle.setFont(cellFont);cellNoColorStyle.setWrapText(true);//設(shè)置自動(dòng)換行// ------------------處理數(shù)據(jù)/start---------------------//表頭int rowNum = 0;if (CollectionUtils.isNotEmpty(columns)) {row = sheet.createRow(rowNum);for (int i = 0; i < columns.size(); i++) {Map column = columns.get(i);cell = row.createCell(i);cell.setCellValue("" + column.get("title") + "");cell.setCellStyle(cellNoColorStyle);}rowNum++;}if (CollectionUtils.isNotEmpty(data)) {for (int i = 0; i < data.size(); i++) {row = sheet.createRow(rowNum);List<String> cellData = data.get(i);for (int j = 0; j < cellData.size(); j++) {cell = row.createCell(j);cell.setCellValue("" + cellData.get(j) + "");cell.setCellStyle(cellNoColorStyle);}rowNum++;}}// ------------------處理數(shù)據(jù)end--------------------------------------wb.write(outs);outs.close();} catch (Exception e) {e.printStackTrace();} }/*** @Description: 下載PPT* @param <map>* @param <HttpServletResponse>* @Author:jlk* @CreateTime:2022-05-24* @throws IOException*/@SuppressWarnings("all")public static void downloadSchemeAnalysesPPT(String customerName, List<SchemeAnalysis> schemeAnalyses, HttpServletRequest request,HttpServletResponse response) throws IOException {String path = request.getSession().getServletContext().getRealPath("upload");String fileName = UUID.randomUUID().toString();File file = new File(path + File.separator + fileName);if (file.mkdirs()) {logger.debug("生成文件夾成功", file.toString());}response.reset();response.setContentType("application/zip");response.setCharacterEncoding("utf-8");response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(customerName + "_分析圖表_" + TimestampTool.getDate(new Date()), "UTF-8"));OutputStream outs = response.getOutputStream();//創(chuàng)建pptXMLSlideShow ppt = new XMLSlideShow();File pptPath = new File(file + File.separator + customerName + "_分析圖表_" + TimestampTool.getDate(new Date()) + ".pptx");Map<Integer, String> dataMap = new HashMap<>();FileOutputStream pptbaos = new FileOutputStream(pptPath);//創(chuàng)建excelXSSFWorkbook wb = new XSSFWorkbook();File excelPath = new File(file + File.separator + customerName + "_分析圖表_" + TimestampTool.getDate(new Date()) + ".xlsx");FileOutputStream excelbaos = new FileOutputStream(excelPath);boolean isppt = false;boolean isexcel = false;try {for (int j = 0; j < schemeAnalyses.size(); j++) {String base64 = schemeAnalyses.get(j).getAnalysisImage();String data = schemeAnalyses.get(j).getAnalysisData();String name = schemeAnalyses.get(j).getAnalysisTopicName();if (StringUtils.isNotBlank(base64)) {XSLFSlide slide = ppt.createSlide();XSLFTextBox shape1 = slide.createTextBox();Rectangle anchor = new Rectangle(30, 30, 300, 50);shape1.setAnchor(anchor);XSLFTextParagraph p1 = shape1.addNewTextParagraph();XSLFTextRun r1 = p1.addNewTextRun();r1.setFontSize(14.00);r1.setFontColor(Color.black);//shape1.setFillColor(Color.red);r1.setText(name);// 圖片文件String imgPathName = file.toString() + File.separator + schemeAnalyses.get(j).getAnalysisTopicName();String imgPath = Base64Util.generateImage(base64, imgPathName);File image = new File(imgPath);//測(cè)試用本地圖片//File image = new File("E://plief.jpg");// 圖片文件輸入流FileInputStream imageFis = new FileInputStream(image);// 獲取圖片大小int len = (int) image.length();// 創(chuàng)建一個(gè)字節(jié)數(shù)組,數(shù)組大小與圖片文件大小一致byte[] imageData = new byte[len];// 將圖片數(shù)據(jù)讀進(jìn)字節(jié)數(shù)組中int pictureData = imageFis.read(imageData);// 將圖片添加到PPT中XSLFPictureData pd = ppt.addPicture(imageData, PictureType.PNG);// 將圖片放到指定的幻燈片中XSLFPictureShape pic = slide.createPicture(pd);// 設(shè)置圖片框的放置的位置和大小pic.setAnchor(new Rectangle2D.Double(100, 160, 520, 200));isppt = true;imageFis.close();}if (StringUtils.isNotBlank(data)) {JSONObject object = JSONObject.parseObject(data);writeExcel(object, wb);isexcel = true;}}ppt.write(pptbaos);wb.write(excelbaos);List<File> fileList = new ArrayList<>();if (isppt)fileList.add(pptPath);if (isexcel)fileList.add(excelPath);ZipUtils.toZip(fileList, outs);} catch (Exception e) {logger.debug("錯(cuò)誤", e);} finally {pptbaos.flush();pptbaos.close();excelbaos.flush();excelbaos.close();outs.flush();outs.close();FileUtilsExt.delFile(file.toString());}}}

zip 工具類

package com.sapit.compensation.common.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream;/*** ZipUtils* @author 季連科* @date 2022年5月23日 下午7:16:08* @version v1.0*/ public class ZipUtils {private static final int BUFFER_SIZE = 2 * 1024;/*** 壓縮成ZIP 方法1* @param srcDir 壓縮文件夾路徑 * @param out 壓縮文件輸出流* @param KeepDirStructure 是否保留原來的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu); * false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會(huì)出現(xiàn)同名文件,會(huì)壓縮失敗)* @throws RuntimeException 壓縮失敗會(huì)拋出運(yùn)行時(shí)異常*/public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)throws RuntimeException{long start = System.currentTimeMillis();ZipOutputStream zos = null ;try {zos = new ZipOutputStream(out);File sourceFile = new File(srcDir);compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);long end = System.currentTimeMillis();System.out.println("壓縮完成,耗時(shí):" + (end - start) +" ms");} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils",e);}finally{if(zos != null){try {zos.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 壓縮成ZIP 方法2* @param srcFiles 需要壓縮的文件列表* @param out 壓縮文件輸出流* @throws RuntimeException 壓縮失敗會(huì)拋出運(yùn)行時(shí)異常*/public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {long start = System.currentTimeMillis();ZipOutputStream zos = null ;try {zos = new ZipOutputStream(out);for (File srcFile : srcFiles) {byte[] buf = new byte[BUFFER_SIZE];zos.putNextEntry(new ZipEntry(srcFile.getName()));int len;FileInputStream in = new FileInputStream(srcFile);while ((len = in.read(buf)) != -1){zos.write(buf, 0, len);}zos.closeEntry();in.close();}long end = System.currentTimeMillis();System.out.println("壓縮完成,耗時(shí):" + (end - start) +" ms");} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils",e);}finally{if(zos != null){try {zos.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 遞歸壓縮方法* @param sourceFile 源文件* @param zos zip輸出流* @param name 壓縮后的名稱* @param KeepDirStructure 是否保留原來的目錄結(jié)構(gòu),true:保留目錄結(jié)構(gòu); * false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結(jié)構(gòu)可能會(huì)出現(xiàn)同名文件,會(huì)壓縮失敗)* @throws Exception*/private static void compress(File sourceFile, ZipOutputStream zos, String name,boolean KeepDirStructure) throws Exception{byte[] buf = new byte[BUFFER_SIZE];if(sourceFile.isFile()){// 向zip輸出流中添加一個(gè)zip實(shí)體,構(gòu)造器中name為zip實(shí)體的文件的名字zos.putNextEntry(new ZipEntry(name));// copy文件到zip輸出流中int len;FileInputStream in = new FileInputStream(sourceFile);while ((len = in.read(buf)) != -1){zos.write(buf, 0, len);}// Complete the entryzos.closeEntry();in.close();} else {File[] listFiles = sourceFile.listFiles();if(listFiles == null || listFiles.length == 0){// 需要保留原來的文件結(jié)構(gòu)時(shí),需要對(duì)空文件夾進(jìn)行處理if(KeepDirStructure){// 空文件夾的處理zos.putNextEntry(new ZipEntry(name + "/"));// 沒有文件,不需要文件的copyzos.closeEntry();}}else {for (File file : listFiles) {// 判斷是否需要保留原來的文件結(jié)構(gòu)if (KeepDirStructure) {// 注意:file.getName()前面需要帶上父文件夾的名字加一斜杠,// 不然最后壓縮包中就不能保留原來的文件結(jié)構(gòu),即:所有文件都跑到壓縮包根目錄下了compress(file, zos, name + "/" + file.getName(),KeepDirStructure);} else {compress(file, zos, file.getName(),KeepDirStructure);}}}}}public static void main(String[] args) throws Exception {/** 測(cè)試壓縮方法1 */FileOutputStream fos1 = new FileOutputStream(new File("c:/mytest01.zip"));ZipUtils.toZip("D:/log", fos1,true);/** 測(cè)試壓縮方法2 */List<File> fileList = new ArrayList<>();fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe"));fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe"));FileOutputStream fos2 = new FileOutputStream(new File("c:/mytest02.zip"));ZipUtils.toZip(fileList, fos2);}public static void zipFile(File inputFile, ZipOutputStream zipoutputStream) {FileInputStream fis = null;BufferedInputStream bis = null;try {if (inputFile.exists()) { // 判斷文件是否存在if (inputFile.isFile()) { // 如果是文件// 創(chuàng)建輸入流讀取文件fis = new FileInputStream(inputFile);bis = new BufferedInputStream(fis);// 將文件寫入zip壓縮包內(nèi)ZipEntry zip =new ZipEntry(inputFile.getParentFile().getName() + File.separator + inputFile.getName()); //獲取文件名zipoutputStream.putNextEntry(zip);// 進(jìn)行寫入文件byte[] bytes = new byte[1024];long fileLength = 0;while (fileLength < inputFile.length()) {int count = bis.read(bytes, 0, 1024);fileLength += count;zipoutputStream.write(bytes, 0, count);}// 關(guān)閉輸入輸出流if (bis != null) {bis.close();}if (fis != null) {fis.close();}} else { // 如果是文件夾,則使用窮舉的方法獲取文件,寫入ziptry {zipoutputStream.putNextEntry(new ZipEntry(inputFile.getName() + File.separator));File[] files = inputFile.listFiles();for (int i = 0; i < files.length; i++) {zipFile(files[i], zipoutputStream);}} catch (Exception e) {e.printStackTrace();}}}} catch (Exception e) {e.printStackTrace();} finally {try {if (bis != null) {bis.close();}if (fis != null) {fis.close();}} catch (IOException e) {e.printStackTrace();}}} }

base64轉(zhuǎn)碼工具類

package com.sapit.compensation.common.util;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Base64;import org.apache.commons.lang3.StringUtils;/*** <p>文件名稱: Base64Util.java </p> * <p>類型描述: [base64處理工具] </p>* <p>創(chuàng)建時(shí)間: 2022年5月23日 </p>* @author jlk* @version V1.0*/ public class Base64Util {/*** <p>功能描述: [解碼] </p>* @Title decode* @param str base64編碼* @return byte[]*/public static byte[] decode(String str) {return Base64.getDecoder().decode(str);}/*** <p>功能描述: [編碼] </p>* @Title encode* @param bytes 需要轉(zhuǎn)換的bytes.* @return String*/public static String encode(byte[] bytes) {return Base64.getEncoder().encodeToString(bytes);}/*** <p>功能描述: [將base64轉(zhuǎn)成文件] </p>* @Title toFile* @param str* @param filePath* @return boolean*/public static boolean toFile(String str, String filePath) {if (StringUtils.isEmpty(str)||StringUtils.isEmpty(filePath)) {return false;}OutputStream out=null;try {// Base64解碼byte[] b = decode(str);for (int i = 0; i < b.length; ++i) {// 調(diào)整異常數(shù)據(jù)if (b[i] < 0) {b[i] += 256;}}// 生成jpeg圖片F(xiàn)ile file = new File(filePath);if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}out = new FileOutputStream(file);out.write(b);out.flush();return true;} catch (Exception e) {return false;}finally {if(out!=null) {try {out.close();} catch (IOException e) {}}}}/*** @Description: 將base64編碼字符串轉(zhuǎn)換為圖片* @Author:* @CreateTime:* @param file base64編碼字符串* @param path 圖片路徑-具體到文件* @return* @throws IOException */public static String generateImage(String file, String path) throws IOException {// 解密OutputStream out = null;try {// 項(xiàng)目絕對(duì)路徑// 圖片分類路徑+圖片名+圖片后綴String imgClassPath = path.concat(".jpg");// 解密Base64.Decoder decoder = Base64.getDecoder();// 去掉base64前綴 data:image/jpeg;base64,file = file.substring(file.indexOf(",", 1) + 1, file.length());byte[] b = decoder.decode(file);// 處理數(shù)據(jù)for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {b[i] += 256;}}// 保存圖片out = new FileOutputStream(imgClassPath);out.write(b);// 返回圖片的相對(duì)路徑 = 圖片分類路徑+圖片名+圖片后綴return imgClassPath;} catch (IOException e) {return null;}finally {out.flush();out.close();}}}

文件工具類

package com.sapit.compensation.common.util;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream;import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import com.google.common.collect.Lists;/*** 文件操作工具類 實(shí)現(xiàn)文件的創(chuàng)建、刪除、復(fù)制、壓縮、解壓以及目錄的創(chuàng)建、刪除、復(fù)制、壓縮解壓等功能** @author aoyuan* @version 2015-3-16*/ public class FileUtilsExt extends org.apache.commons.io.FileUtils {private static final String HTML = "html";private static final String HTM = "htm";private static final String SHTML = "shtml";private static final String APK = "apk";private static final String SIS = "sis";private static final String SISX = "sisx";private static final String EXE = "exe";private static final String MSI = "msi";private static final String CSS = "css";private static final String XML = "xml";private static final String GIF = "gif";private static final String JPEG = "jpeg";private static final String JPG = "jpg";private static final String JS = "js";private static final String ATOM = "atom";private static final String RSS = "rss";private static final String MML = "mml";private static final String TXT = "txt";private static final String JAD = "jad";private static final String WML = "wml";private static final String HTC = "htc";private static final String PNG = "png";private static final String TIF = "tif";private static final String TIFF = "tiff";private static final String WBMP = "wbmp";private static final String ICO = "ico";private static final String JNG = "jng";private static final String BMP = "bmp";private static final String SVG = "svg";private static final String JAR = "jar";private static final String VAR = "var";private static final String EAR = "ear";private static final String DOC = "doc";private static final String PDF = "pdf";private static final String RTF = "rtf";private static final String XLS = "xls";private static final String PPT = "ppt";private static final String SEVEN_Z = "7z";private static final String RAR = "rar";private static final String SWF = "swf";private static final String RPM = "rpm";private static final String DER = "der";private static final String PEM = "pem";private static final String CRT = "crt";private static final String XHTML = "xhtml";private static final String ZIP = "zip";private static final String MID = "mid";private static final String MIDI = "midi";private static final String KAR = "kar";private static final String MP3 = "mp3";private static final String OGG = "ogg";private static final String M4A = "m4a";private static final String RA = "ra";private static final String THREE_GPP = "3gpp";private static final String THREE_GP = "3gp";private static final String MP4 = "mp4";private static final String MPEG = "mpeg";private static final String MPG = "mpg";private static final String MOV = "mov";private static final String FLV = "flv";private static final String M4V = "m4v";private static final String MNG = "pem";private static final String ASX = "asx";private static final String ASF = "asf";private static final String WMV = "wmv";private static final String AVI = "avi";private static Logger logger = LoggerFactory.getLogger(com.sapit.compensation.common.util.FileUtilsExt.class);/*** 復(fù)制單個(gè)文件,如果目標(biāo)文件存在,則不覆蓋** @param srcFileName 待復(fù)制的文件名* @param descFileName 目標(biāo)文件名* @return 如果復(fù)制成功,則返回true,否則返回false*/public static boolean copyFile(String srcFileName, String descFileName) {return com.sapit.compensation.common.util.FileUtilsExt.copyFileCover(srcFileName, descFileName, false);}/*** 復(fù)制單個(gè)文件** @param srcFileName 待復(fù)制的文件名* @param descFileName 目標(biāo)文件名* @param coverlay 如果目標(biāo)文件已存在,是否覆蓋* @return 如果復(fù)制成功,則返回true,否則返回false*/public static boolean copyFileCover(String srcFileName, String descFileName, boolean coverlay) {File srcFile = new File(srcFileName);// 判斷源文件是否存在if (!srcFile.exists()) {logger.debug("復(fù)制文件失敗,源文件 {} 不存在!", srcFileName);return false;}// 判斷源文件是否是合法的文件else if (!srcFile.isFile()) {logger.debug("復(fù)制文件失敗,{} 不是一個(gè)文件!", srcFileName);return false;}File descFile = new File(descFileName);// 判斷目標(biāo)文件是否存在if (descFile.exists()) {// 如果目標(biāo)文件存在,并且允許覆蓋if (coverlay) {logger.debug("目標(biāo)文件已存在,準(zhǔn)備刪除!");if (!com.sapit.compensation.common.util.FileUtilsExt.delFile(descFileName)) {logger.debug("刪除目標(biāo)文件 {} 失敗!", descFileName);return false;}} else {logger.debug("復(fù)制文件失敗,目標(biāo)文件{} 已存在!", descFileName);return false;}} else {if (!descFile.getParentFile().exists()) {// 如果目標(biāo)文件所在的目錄不存在,則創(chuàng)建目錄logger.debug("目標(biāo)文件所在的目錄不存在,創(chuàng)建目錄!");// 創(chuàng)建目標(biāo)文件所在的目錄if (!descFile.getParentFile().mkdirs()) {logger.debug("創(chuàng)建目標(biāo)文件所在的目錄失敗!");return false;}}}// 準(zhǔn)備復(fù)制文件// 讀取的位數(shù)int readByte = 0;InputStream ins = null;OutputStream outs = null;try {// 打開源文件ins = new FileInputStream(srcFile);// 打開目標(biāo)文件的輸出流outs = new FileOutputStream(descFile);byte[] buf = new byte[1024];// 一次讀取1024個(gè)字節(jié),當(dāng)readByte為-1時(shí)表示文件已經(jīng)讀取完畢while ((readByte = ins.read(buf)) != -1) {// 將讀取的字節(jié)流寫入到輸出流outs.write(buf, 0, readByte);}logger.info("復(fù)制單個(gè)文件{} 到 {} 成功!", srcFileName, descFileName);return true;} catch (Exception e) {logger.info("復(fù)制文件失敗:{}", e.getMessage());return false;} finally {// 關(guān)閉輸入輸出流,首先關(guān)閉輸出流,然后再關(guān)閉輸入流if (outs != null) {try {outs.close();} catch (IOException oute) {logger.info(oute.getMessage());}}if (ins != null) {try {ins.close();} catch (IOException ine) {logger.info(ine.getMessage());}}}}/*** 復(fù)制整個(gè)目錄的內(nèi)容,如果目標(biāo)目錄存在,則不覆蓋** @param srcDirName 源目錄名* @param descDirName 目標(biāo)目錄名* @return 如果復(fù)制成功返回true,否則返回false*/public static boolean copyDirectory(String srcDirName, String descDirName) {return com.sapit.compensation.common.util.FileUtilsExt.copyDirectoryCover(srcDirName, descDirName, false);}/*** 復(fù)制整個(gè)目錄的內(nèi)容** @param srcDirName 源目錄名* @param descDirName 目標(biāo)目錄名* @param coverlay 如果目標(biāo)目錄存在,是否覆蓋* @return 如果復(fù)制成功返回true,否則返回false*/public static boolean copyDirectoryCover(String srcDirName, String descDirName, boolean coverlay) {File srcDir = new File(srcDirName);// 判斷源目錄是否存在if (!srcDir.exists()) {logger.debug("復(fù)制目錄失敗,源目錄 {} 不存在!", srcDirName);return false;}// 判斷源目錄是否是目錄else if (!srcDir.isDirectory()) {logger.debug("復(fù)制目錄失敗,{} 不是一個(gè)目錄!", srcDirName);return false;}// 如果目標(biāo)文件夾名不以文件分隔符結(jié)尾,自動(dòng)添加文件分隔符String descDirNames = descDirName;if (!descDirNames.endsWith(File.separator)) {descDirNames = descDirNames + File.separator;}File descDir = new File(descDirNames);// 如果目標(biāo)文件夾存在if (descDir.exists()) {if (coverlay) {// 允許覆蓋目標(biāo)目錄logger.debug("目標(biāo)目錄已存在,準(zhǔn)備刪除!");if (!com.sapit.compensation.common.util.FileUtilsExt.delFile(descDirNames)) {logger.debug("刪除目錄 {} 失敗!", descDirNames);return false;}} else {logger.debug("目標(biāo)目錄復(fù)制失敗,目標(biāo)目錄 {} 已存在!", descDirNames);return false;}} else {// 創(chuàng)建目標(biāo)目錄logger.debug("目標(biāo)目錄不存在,準(zhǔn)備創(chuàng)建!");if (!descDir.mkdirs()) {logger.debug("創(chuàng)建目標(biāo)目錄失敗!");return false;}}boolean flag = true;// 列出源目錄下的所有文件名和子目錄名File[] files = srcDir.listFiles();for (int i = 0; i < files.length; i++) {// 如果是一個(gè)單個(gè)文件,則直接復(fù)制if (files[i].isFile()) {flag = com.sapit.compensation.common.util.FileUtilsExt.copyFile(files[i].getAbsolutePath(), descDirName + files[i].getName());// 如果拷貝文件失敗,則退出循環(huán)if (!flag) {break;}}// 如果是子目錄,則繼續(xù)復(fù)制目錄if (files[i].isDirectory()) {flag = com.sapit.compensation.common.util.FileUtilsExt.copyDirectory(files[i].getAbsolutePath(), descDirName + files[i].getName());// 如果拷貝目錄失敗,則退出循環(huán)if (!flag) {break;}}}if (!flag) {logger.debug("復(fù)制目錄 {} 到 {} 失敗!", srcDirName, descDirName);return false;}logger.debug("復(fù)制目錄 {} 到 {} 成功!", srcDirName, descDirName);return true;}/*** 刪除文件,可以刪除單個(gè)文件或文件夾** @param fileName 被刪除的文件名* @return 如果刪除成功,則返回true,否是返回false*/public static boolean delFile(String fileName) {File file = new File(fileName);if (!file.exists()) {logger.debug("{} 文件不存在!", fileName);return true;} else {if (file.isFile()) {return com.sapit.compensation.common.util.FileUtilsExt.deleteFile(fileName);} else {return com.sapit.compensation.common.util.FileUtilsExt.deleteDirectory(fileName);}}}/*** 刪除單個(gè)文件** @param fileName 被刪除的文件名* @return 如果刪除成功,則返回true,否則返回false*/public static boolean deleteFile(String fileName) {File file = new File(fileName);if (file.exists() && file.isFile()) {if (file.delete()) {logger.debug("刪除文件 {} 成功!", fileName);return true;} else {logger.debug("刪除文件 {} 失敗!", fileName);return false;}} else {logger.debug("{} 文件不存在!", fileName);return true;}}/*** 刪除目錄及目錄下的文件** @param dirName 被刪除的目錄所在的文件路徑* @return 如果目錄刪除成功,則返回true,否則返回false*/public static boolean deleteDirectory(String dirName) {String dirNames = dirName;if (!dirNames.endsWith(File.separator)) {dirNames = dirNames + File.separator;}File dirFile = new File(dirNames);if (!dirFile.exists() || !dirFile.isDirectory()) {logger.debug("{} 目錄不存在!", dirNames);return true;}boolean flag = true;// 列出全部文件及子目錄File[] files = dirFile.listFiles();for (int i = 0; i < files.length; i++) {// 刪除子文件if (files[i].isFile()) {flag = com.sapit.compensation.common.util.FileUtilsExt.deleteFile(files[i].getAbsolutePath());// 如果刪除文件失敗,則退出循環(huán)if (!flag) {break;}}// 刪除子目錄else if (files[i].isDirectory()) {flag = com.sapit.compensation.common.util.FileUtilsExt.deleteDirectory(files[i].getAbsolutePath());// 如果刪除子目錄失敗,則退出循環(huán)if (!flag) {break;}}}if (!flag) {logger.debug("刪除目錄失敗!");return false;}// 刪除當(dāng)前目錄if (dirFile.delete()) {logger.debug("刪除目錄 {} 成功!", dirName);return true;} else {logger.debug("刪除目錄 {} 失敗!", dirName);return false;}}/*** 創(chuàng)建單個(gè)文件** @param descFileName 文件名,包含路徑* @return 如果創(chuàng)建成功,則返回true,否則返回false*/public static boolean createFile(String descFileName) {File file = new File(descFileName);if (file.exists()) {logger.debug("文件{} 已存在!", descFileName);return false;}if (descFileName.endsWith(File.separator)) {logger.debug("{} 為目錄,不能創(chuàng)建目錄!", descFileName);return false;}if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) {// 如果文件所在的目錄不存在,則創(chuàng)建目錄logger.debug("創(chuàng)建文件所在的目錄失敗!");return false;}// 創(chuàng)建文件try {if (file.createNewFile()) {logger.debug("{} 文件創(chuàng)建成功!", descFileName);return true;} else {logger.info("{} 文件創(chuàng)建失敗!", descFileName);return false;}} catch (Exception e) {logger.info("{} 文件創(chuàng)建失敗!", descFileName);return false;}}/*** 創(chuàng)建目錄** @param descDirName 目錄名,包含路徑* @return 如果創(chuàng)建成功,則返回true,否則返回false*/public static boolean createDirectory(String descDirName) {String descDirNames = descDirName;if (!descDirNames.endsWith(File.separator)) {descDirNames = descDirNames + File.separator;}File descDir = new File(descDirNames);if (descDir.exists()) {logger.debug("目錄 {} 已存在!", descDirNames);return false;}// 創(chuàng)建目錄if (descDir.mkdirs()) {logger.debug("目錄 {} 創(chuàng)建成功!", descDirNames);return true;} else {logger.debug("目錄 {} 創(chuàng)建失敗!", descDirNames);return false;}}/*** 寫入文件** @param fileName* @param content* @param append*/public static void writeToFile(String fileName, String content, boolean append) {try {org.apache.commons.io.FileUtils.write(new File(fileName), content, "utf-8", append);logger.debug("文件 {} 寫入成功!", fileName);} catch (IOException e) {logger.info("文件 {} 寫入失敗! {}", fileName, e.getMessage());}}/*** 寫入文件** @param fileName* @param content* @param encoding* @param append*/public static void writeToFile(String fileName, String content, String encoding, boolean append) {try {org.apache.commons.io.FileUtils.write(new File(fileName), content, encoding, append);logger.debug("文件 {} 寫入成功!", fileName);} catch (IOException e) {logger.info("文件 {} 寫入失敗! {}", fileName, e.getMessage());}}/*** 壓縮文件或目錄** @param srcDirName 壓縮的根目錄* @param fileName 根目錄下的待壓縮的文件名或文件夾名,其中*或""表示跟目錄下的全部文件* @param descFileName 目標(biāo)zip文件*/public static void zipFiles(String srcDirName, String fileName, String descFileName) {// 判斷目錄是否存在if (srcDirName == null) {logger.debug("文件壓縮失敗,目錄 {} 不存在! ", srcDirName);return;}File fileDir = new File(srcDirName);if (!fileDir.exists() || !fileDir.isDirectory()) {logger.debug("文件壓縮失敗,目錄 {} 不存在! ", srcDirName);return;}String dirPath = fileDir.getAbsolutePath();File descFile = new File(descFileName);FileOutputStream fos = null;ZipOutputStream zouts = null;try {fos = new FileOutputStream(descFile);zouts = new ZipOutputStream(fos);if ("*".equals(fileName) || "".equals(fileName)) {com.sapit.compensation.common.util.FileUtilsExt.zipDirectoryToZipFile(dirPath, fileDir, zouts);} else {File file = new File(fileDir, fileName);if (file.isFile()) {com.sapit.compensation.common.util.FileUtilsExt.zipFilesToZipFile(dirPath, file, zouts);} else {com.sapit.compensation.common.util.FileUtilsExt.zipDirectoryToZipFile(dirPath, file, zouts);}}logger.debug("{} 文件壓縮成功!", descFileName);} catch (Exception e) {logger.info("文件壓縮失敗: {}", e.getMessage());} finally {IOUtils.closeQuietly(fos);IOUtils.closeQuietly(zouts);}}/*** 將目錄壓縮到ZIP輸出流** @param dirPath 目錄路徑* @param fileDir 文件信息* @param zouts 輸出流*/public static void zipDirectoryToZipFile(String dirPath, File fileDir, ZipOutputStream zouts) {if (fileDir.isDirectory()) {File[] files = fileDir.listFiles();// 空的文件夾if (files.length == 0) {// 目錄信息ZipEntry entry = new ZipEntry(getEntryName(dirPath, fileDir));try {zouts.putNextEntry(entry);zouts.closeEntry();} catch (Exception e) {logger.info("異常", e);}return;}for (int i = 0; i < files.length; i++) {if (files[i].isFile()) {// 如果是文件,則調(diào)用文件壓縮方法com.sapit.compensation.common.util.FileUtilsExt.zipFilesToZipFile(dirPath, files[i], zouts);} else {// 如果是目錄,則遞歸調(diào)用com.sapit.compensation.common.util.FileUtilsExt.zipDirectoryToZipFile(dirPath, files[i], zouts);}}}}/*** 將文件壓縮到ZIP輸出流** @param dirPath 目錄路徑* @param file 文件* @param zouts 輸出流*/public static void zipFilesToZipFile(String dirPath, File file, ZipOutputStream zouts) {FileInputStream fin = null;ZipEntry entry;// 創(chuàng)建復(fù)制緩沖區(qū)byte[] buf = new byte[4096];int readByte;if (file.isFile()) {try {// 創(chuàng)建一個(gè)文件輸入流fin = new FileInputStream(file);// 創(chuàng)建一個(gè)ZipEntryentry = new ZipEntry(getEntryName(dirPath, file));// 存儲(chǔ)信息到壓縮文件zouts.putNextEntry(entry);// 復(fù)制字節(jié)到壓縮文件while ((readByte = fin.read(buf)) != -1) {zouts.write(buf, 0, readByte);}zouts.closeEntry();fin.close();logger.info("添加文件{} 到zip文件中!", file.getAbsolutePath());} catch (Exception e) {logger.info("異常", e);} finally {IOUtils.closeQuietly(fin);}}}/*** 獲取待壓縮文件在ZIP文件中entry的名字,即相對(duì)于跟目錄的相對(duì)路徑名** @param dirPath 目錄名* @param file entry文件名* @return*/private static String getEntryName(String dirPath, File file) {String dirPaths = dirPath;if (!dirPaths.endsWith(File.separator)) {dirPaths = dirPaths + File.separator;}String filePath = file.getAbsolutePath();// 對(duì)于目錄,必須在entry名字后面加上"/",表示它將以目錄項(xiàng)存儲(chǔ)if (file.isDirectory()) {filePath += "/";}int index = filePath.indexOf(dirPaths);return filePath.substring(index + dirPaths.length());}/*** 根據(jù)“文件名的后綴”獲取文件內(nèi)容類型(而非根據(jù)File.getContentType()讀取的文件類型)** @param returnFileName 帶驗(yàn)證的文件名* @return 返回文件類型*/public static String getContentType(String returnFileName) {String contentType = "application/octet-stream";if (returnFileName.lastIndexOf('.') < 0) {return contentType;}returnFileName = returnFileName.toLowerCase();returnFileName = returnFileName.substring(returnFileName.lastIndexOf('.') + 1);if (returnFileName.equals(HTML) || returnFileName.equals(HTM) || returnFileName.equals(SHTML)) {contentType = "text/html";} else if (returnFileName.equals(APK)) {contentType = "application/vnd.android.package-archive";} else if (returnFileName.equals(SIS) || returnFileName.equals(SISX)) {contentType = "application/vnd.symbian.install";} else if (returnFileName.equals(EXE) || returnFileName.equals(MSI)) {contentType = "application/x-msdownload";} else if (returnFileName.equals(CSS)) {contentType = "text/css";} else if (returnFileName.equals(XML)) {contentType = "text/xml";} else if (returnFileName.equals(GIF)) {contentType = "image/gif";} else if (returnFileName.equals(JPEG) || returnFileName.equals(JPG)) {contentType = "image/jpeg";} else if (returnFileName.equals(JS)) {contentType = "application/x-javascript";} else if (returnFileName.equals(ATOM)) {contentType = "application/atom+xml";} else if (returnFileName.equals(RSS)) {contentType = "application/rss+xml";} else if (returnFileName.equals(MML)) {contentType = "text/mathml";} else if (returnFileName.equals(TXT)) {contentType = "text/plain";} else if (returnFileName.equals(JAD)) {contentType = "text/vnd.sun.j2me.app-descriptor";} else if (returnFileName.equals(WML)) {contentType = "text/vnd.wap.wml";} else if (returnFileName.equals(HTC)) {contentType = "text/x-component";} else if (returnFileName.equals(PNG)) {contentType = "image/png";} else if (returnFileName.equals(TIF) || returnFileName.equals(TIFF)) {contentType = "image/tiff";} else if (returnFileName.equals(WBMP)) {contentType = "image/vnd.wap.wbmp";} else if (returnFileName.equals(ICO)) {contentType = "image/x-icon";} else if (returnFileName.equals(JNG)) {contentType = "image/x-jng";} else if (returnFileName.equals(BMP)) {contentType = "image/x-ms-bmp";} else if (returnFileName.equals(SVG)) {contentType = "image/svg+xml";} else if (returnFileName.equals(JAR) || returnFileName.equals(VAR) || returnFileName.equals(EAR)) {contentType = "application/java-archive";} else if (returnFileName.equals(DOC)) {contentType = "application/msword";} else if (returnFileName.equals(PDF)) {contentType = "application/pdf";} else if (returnFileName.equals(RTF)) {contentType = "application/rtf";} else if (returnFileName.equals(XLS)) {contentType = "application/vnd.ms-excel";} else if (returnFileName.equals(PPT)) {contentType = "application/vnd.ms-powerpoint";} else if (returnFileName.equals(SEVEN_Z)) {contentType = "application/x-7z-compressed";} else if (returnFileName.equals(RAR)) {contentType = "application/x-rar-compressed";} else if (returnFileName.equals(SWF)) {contentType = "application/x-shockwave-flash";} else if (returnFileName.equals(RPM)) {contentType = "application/x-redhat-package-manager";} else if (returnFileName.equals(DER) || returnFileName.equals(PEM) || returnFileName.equals(CRT)) {contentType = "application/x-x509-ca-cert";} else if (returnFileName.equals(XHTML)) {contentType = "application/xhtml+xml";} else if (returnFileName.equals(ZIP)) {contentType = "application/zip";} else if (returnFileName.equals(MID) || returnFileName.equals(MIDI) || returnFileName.equals(KAR)) {contentType = "audio/midi";} else if (returnFileName.equals(MP3)) {contentType = "audio/mpeg";} else if (returnFileName.equals(OGG)) {contentType = "audio/ogg";} else if (returnFileName.equals(M4A)) {contentType = "audio/x-m4a";} else if (returnFileName.equals(RA)) {contentType = "audio/x-realaudio";} else if (returnFileName.equals(THREE_GPP) || returnFileName.equals(THREE_GP)) {contentType = "video/3gpp";} else if (returnFileName.equals(MP4)) {contentType = "video/mp4";} else if (returnFileName.equals(MPEG) || returnFileName.equals(MPG)) {contentType = "video/mpeg";} else if (returnFileName.equals(MOV)) {contentType = "video/quicktime";} else if (returnFileName.equals(FLV)) {contentType = "video/x-flv";} else if (returnFileName.equals(M4V)) {contentType = "video/x-m4v";} else if (returnFileName.equals(MNG)) {contentType = "video/x-mng";} else if (returnFileName.equals(ASX) || returnFileName.equals(ASF)) {contentType = "video/x-ms-asf";} else if (returnFileName.equals(WMV)) {contentType = "video/x-ms-wmv";} else if (returnFileName.equals(AVI)) {contentType = "video/x-msvideo";}return contentType;}/*** 修正路徑,將 \\ 或 / 等替換為 File.separator** @param path 待修正的路徑* @return 修正后的路徑*/public static String path(String path) {String p = org.apache.commons.lang3.StringUtils.replace(path, "\\", "/");p = org.apache.commons.lang3.StringUtils.join(org.apache.commons.lang3.StringUtils.split(p, "/"), "/");if (!org.apache.commons.lang3.StringUtils.startsWithAny(p, "/") && org.apache.commons.lang3.StringUtils.startsWithAny(path, "\\", "/")) {p += "/";}if (!org.apache.commons.lang3.StringUtils.endsWithAny(p, "/") && org.apache.commons.lang3.StringUtils.endsWithAny(path, "\\", "/")) {p = p + "/";}if (path != null && path.startsWith("/")) {p = "/" + p; // linux下路徑}return p;}/*** 獲目錄下的文件列表** @param dir 搜索目錄* @param searchDirs 是否是搜索目錄* @return 文件列表*/public static List<String> findChildrenList(File dir, boolean searchDirs) {List<String> files = Lists.newArrayList();for (String subFiles : dir.list()) {File file = new File(dir, subFiles);if (((searchDirs) && (file.isDirectory())) || ((!searchDirs) && (!file.isDirectory()))) {files.add(file.getName());}}return files;}/*** 獲取文件擴(kuò)展名(返回小寫)** @param fileName 文件名* @return 例如:test.jpg 返回: jpg*/public static String getFileExtension(String fileName) {if ((fileName == null) || (fileName.lastIndexOf('.') == -1) || (fileName.lastIndexOf('.') == fileName.length() - 1)) {return null;}return org.apache.commons.lang3.StringUtils.lowerCase(fileName.substring(fileName.lastIndexOf('.') + 1));}/*** 獲取文件名,不包含擴(kuò)展名** @param fileName 文件名* @return 例如:d:\files\test.jpg 返回:d:\files\test*/public static String getFileNameWithoutExtension(String fileName) {if ((fileName == null) || (fileName.lastIndexOf('.') == -1)) {return null;}return fileName.substring(0, fileName.lastIndexOf('.'));}/*** <p>功能描述: [自動(dòng)創(chuàng)建多層目錄] </p>* @Title mkdirs* @param destPath*/public static void mkdirs(String destPath) {File file = new File(destPath);// 當(dāng)文件夾不存在時(shí),mkdirs會(huì)自動(dòng)創(chuàng)建多層目錄,區(qū)別于mkdir.(mkdir如果父目錄不存在則會(huì)拋出異常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}} }

時(shí)間戳工具類

package com.sapit.compensation.common.util;import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;public final class TimestampTool {private static String formatter = "yyyy-MM-dd";private static Logger logger = LoggerFactory.getLogger(TimestampTool.class);private TimestampTool() {throw new IllegalStateException("Utility class");}// 當(dāng)前時(shí)間public static Timestamp crunttime() {return new Timestamp(System.currentTimeMillis());}// 獲取當(dāng)前時(shí)間的字符串 2006-07-07public static String getCurrentDate() {Timestamp d = crunttime();return d.toString().substring(0, 10);}// 獲取當(dāng)前時(shí)間的字符串 2006-07-07 22:10:10public static String getCurrentDateTime() {Timestamp d = crunttime();return d.toString().substring(0, 19);}// 獲取給定時(shí)間的字符串,只有日期 2006-07-07public static String getStrDate(Timestamp t) {return t.toString().substring(0, 10);}// 獲取給定時(shí)間的字符串,只有日期 20060707public static String getStringDate() {Timestamp t = crunttime();return t.toString().substring(0, 10).replace("-", "");}// 獲取給定時(shí)間的字符串 2006-07-07 22:10:10public static String getStrDateTime(Timestamp t) {return t.toString().substring(0, 19);}// 獲取當(dāng)前日期之前的日期字符串 如 2007-04-15 前5月 就是 2006-11-15public static String getPreviousMonth(int month) {Calendar cal1 = Calendar.getInstance();cal1.setTime(new Date());cal1.add(Calendar.MONTH, -month);SimpleDateFormat format = new SimpleDateFormat(formatter);return format.format(cal1.getTime());}public static String getPreviousMonth(int month, String format) {Calendar cal1 = Calendar.getInstance();cal1.setTime(new Date());cal1.add(Calendar.MONTH, -month);SimpleDateFormat formatter = new SimpleDateFormat(format);return formatter.format(cal1.getTime());}public static String getPreviousMonth(Date date, int month) {Calendar cal1 = Calendar.getInstance();cal1.setTime(date);cal1.add(Calendar.MONTH, -month);SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return formatter.format(cal1.getTime());}/*** 日期月份加減** @param date Date* @param month 正數(shù):向前推xxx個(gè)月,負(fù)數(shù):向后推xxx個(gè)月* @return Date* @author YJH*/public static Date getPreviousMonthReturnDate(Date date, int month) {Calendar cal1 = Calendar.getInstance();cal1.setTime(date);cal1.add(Calendar.MONTH, -month);return cal1.getTime();}public static String getPreviousMonth(Date date, int month, String format) {Calendar cal1 = Calendar.getInstance();cal1.setTime(date);cal1.add(Calendar.MONTH, -month);SimpleDateFormat formatter = new SimpleDateFormat(format);return formatter.format(cal1.getTime());}// 獲取當(dāng)前日期之后的日期字符串 如 2007-04-15 后一天 就是 2007-04-16public static String getNextDay(int day) {Calendar cal1 = Calendar.getInstance();cal1.setTime(new Date());cal1.add(Calendar.DAY_OF_MONTH, day);SimpleDateFormat format = new SimpleDateFormat(formatter);return format.format(cal1.getTime());}public static Date getNextHour(int hour) {Calendar cal1 = Calendar.getInstance();cal1.setTime(new Date());cal1.add(Calendar.HOUR_OF_DAY, hour);return cal1.getTime();}public static Date getNextHour(Date date, int hour) {Calendar cal1 = Calendar.getInstance();cal1.setTime(date);cal1.add(Calendar.HOUR_OF_DAY, hour);return cal1.getTime();}public static Date getNextMinute(int minute) {Calendar cal1 = Calendar.getInstance();cal1.setTime(new Date());cal1.add(Calendar.MINUTE, minute);return cal1.getTime();}// 獲取指定日期之后的日期字符串 如 2007-04-15 后一天 就是 2007-04-16public static String getNextDay(String strDate, int day) {Calendar c = Calendar.getInstance();String[] string = strDate.trim().split("-");int one = Integer.parseInt(string[0]) - 1900;int two = Integer.parseInt(string[1]) - 1;int three = Integer.parseInt(string[2]);c.set(one, two, three);c.add(Calendar.DAY_OF_MONTH, day);SimpleDateFormat format = new SimpleDateFormat(formatter);return format.format(c.getTime());}public static Date getNextDay(Date date, int day) {Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.DAY_OF_MONTH, day);return cal.getTime();}/*** 得到當(dāng)前的毫秒日期20120201165044734,17位字符串*/public static synchronized String getMillisecond() {return crunttime().toString().replace("-", "").replace(" ", "").replace(":", "").replace("\\.", "");}public static String getDate(Date date) {SimpleDateFormat sdf = new SimpleDateFormat(formatter);return sdf.format(date);}public static String getDateTime(Date date) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return sdf.format(date);}public static String formatDate(Date date, String format) {SimpleDateFormat sdf = new SimpleDateFormat(format);return sdf.format(date);}public static String format(String format) {SimpleDateFormat sdf = new SimpleDateFormat(format);return sdf.format(crunttime());}public static String getStringDate(Date date) {SimpleDateFormat sdf = new SimpleDateFormat(formatter);String dateStr = sdf.format(date);return dateStr.replace("-", "");}public static String dateStr(String date) {String dateStr = "";if (StringUtils.isNotBlank(date)) {dateStr = " to_date('" + date + " 00:00:00','yyyy-MM-dd HH24:mi:ss') ";}return dateStr;}/*** subtractDate:(得到兩個(gè)日期相減的結(jié)果)** @param @param minuend(被減數(shù))* @param @param subtrahend(減數(shù))* @param @param returnType(返回類型:1-毫秒,2-秒,3-分,4-小時(shí),5-天,6-月,7-年)* @param @return* @return long DOM對(duì)象* @throws @since CodingExample Ver 1.1*/public static long subtractDate(Date minuend, Date subtrahend, int returnType) {long result = 0;long millionSecondsForMinuend = minuend.getTime();long millionSecondsForSubtrahend = subtrahend.getTime();long subtract = millionSecondsForMinuend - millionSecondsForSubtrahend;switch (returnType) {case 1:result = subtract;break;case 2:result = subtract / 1000;break;case 3:result = subtract / 1000 / 60;break;case 4:result = subtract / 1000 / 60 / 60;break;case 5:result = subtract / 1000 / 60 / 60 / 24;break;case 6:result = subtract / 1000 / 60 / 60 / 24 / 30;break;case 7:result = subtract / 1000 / 60 / 60 / 24 / 30 / 12;break;default:result = 0;}return result;}/*** 取得當(dāng)前日期是多少周** @param date* @return*/public static int getWeekOfYear(Date date) {Calendar c = Calendar.getInstance();c.setFirstDayOfWeek(Calendar.MONDAY);/*** 設(shè)置一年中第一個(gè)星期所需的最少天數(shù),例如,如果定義第一個(gè)星期包含一年第一個(gè)月的第一天,則使用值 1 調(diào)用此方法。* 如果最少天數(shù)必須是一整個(gè)星期,則使用值 7 調(diào)用此方法。**/c.setMinimalDaysInFirstWeek(1);c.setTime(date);return c.get(Calendar.WEEK_OF_YEAR);}/*** 得到某一年周的總數(shù)** @param year* @return*/public static int getMaxWeekNumOfYear(int year) {Calendar c = Calendar.getInstance();c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);return getWeekOfYear(c.getTime());}/*** 得到某年某周的第一天** @param year* @param week* @return*/public static Date getFirstDayOfWeek(int year, int week) {Calendar c = Calendar.getInstance();c.set(Calendar.YEAR, year);c.set(Calendar.WEEK_OF_YEAR, week);c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);// 設(shè)置周一c.setFirstDayOfWeek(Calendar.MONDAY);c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);return c.getTime();}/*** 得到某年某周的最后一天** @param year* @param week* @return*/public static Date getLastDayOfWeek(int year, int week) {Calendar c = Calendar.getInstance();c.set(Calendar.YEAR, year);c.set(Calendar.WEEK_OF_YEAR, week);c.setFirstDayOfWeek(Calendar.MONDAY);c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sundayc.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);return c.getTime();}/*** 得到某年某月的第一天** @param year* @param month* @return*/public static Date getFirstDayOfMonth(int year, int month) {Calendar c = Calendar.getInstance();c.set(Calendar.YEAR, year);c.set(Calendar.MONTH, month - 1);c.set(Calendar.DAY_OF_MONTH, c.getActualMinimum(Calendar.DAY_OF_MONTH));c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);return c.getTime();}/*** 得到某年某月的最后一天** @param year* @param month* @return*/public static Date getLastDayOfMonth(int year, int month) {Calendar c = Calendar.getInstance();c.set(Calendar.YEAR, year);c.set(Calendar.MONTH, month - 1);c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));c.set(Calendar.HOUR_OF_DAY, 0);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);c.set(Calendar.MILLISECOND, 0);return c.getTime();}/*** 得到某年某季度第一天** @param year* @param quarter* @return*/public static Date getFirstDayOfQuarter(int year, int quarter) {int month;if (quarter > 4) {return null;} else {month = (quarter - 1) * 3 + 1;}return getFirstDayOfMonth(year, month);}/*** 得到某年某季度最后一天** @param year* @param quarter* @return*/public static Date getLastDayOfQuarter(int year, int quarter) {int month;if (quarter > 4) {return null;} else {month = quarter * 3;}return getLastDayOfMonth(year, month);}/*** 得到某年第一天** @param year* @return*/public static Date getFirstDayOfYear(int year) {return getFirstDayOfQuarter(year, 1);}/*** 得到某年最后一天** @param year* @return*/public static Date getLastDayOfYear(int year) {return getLastDayOfQuarter(year, 4);}/*** 獲取當(dāng)月的 天數(shù)*/public static int getCurrentMonthDay() {Calendar a = Calendar.getInstance();a.set(Calendar.DATE, 1);a.roll(Calendar.DATE, -1);return a.get(Calendar.DATE);}/*** 根據(jù)年 月 獲取對(duì)應(yīng)的月份 天數(shù)*/public static int getDaysByYearMonth(int year, int month) {Calendar a = Calendar.getInstance();a.set(Calendar.YEAR, year);a.set(Calendar.MONTH, month - 1);a.set(Calendar.DATE, 1);a.roll(Calendar.DATE, -1);return a.get(Calendar.DATE);}/*** 根據(jù)日期 找到對(duì)應(yīng)日期的 星期*/public static String getDayOfWeekByDate(String date) {String dayOfweek = "-1";try {SimpleDateFormat myFormatter = new SimpleDateFormat(formatter);Date myDate = myFormatter.parse(date);SimpleDateFormat formatter = new SimpleDateFormat("E");String str = formatter.format(myDate);dayOfweek = str;} catch (Exception e) {logger.info("error: ", e);}return dayOfweek;}public static int getYear(Date date) {Calendar c = Calendar.getInstance();c.setTime(date);return c.get(Calendar.YEAR);}public static int getMonth(Date date) {Calendar c = Calendar.getInstance();c.setTime(date);return c.get(Calendar.MONTH) + 1;}// 獲取yf=‘2014-04’前1個(gè)月的月份,返回2014-03public static String getPreviousMonth(String date) {int nd = Integer.parseInt(date.substring(0, 4));int yf = Integer.parseInt(date.substring(5, 7));if (yf == 1) {nd = nd - 1;yf = 12;} else {yf = yf - 1;}return getDate(getFirstDayOfMonth(nd, yf)).substring(0, 7);}public static Date getDateByString(String formatter ,String date) {SimpleDateFormat myFormatter = new SimpleDateFormat(formatter);Date myDate = null;try {myDate = myFormatter.parse(date);} catch (ParseException e) {e.printStackTrace();}return myDate;} }

總結(jié)

以上是生活随笔為你收集整理的【zip导出】下载导出包含图片,excel,pdf的zip压缩包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

人人dvd| 99视频导航 | 综合久久久久久久久 | 日本韩国欧美在线观看 | 中文字幕精品一区 | 欧美在线视频第一页 | av网站在线免费观看 | 国产精品久久久一区二区 | 国内精品久久久久影院日本资源 | 中文字幕一区二区在线播放 | 三级黄色免费片 | 热久久视久久精品18亚洲精品 | 91你懂的| 日韩av成人在线 | 国产精品第三页 | 亚洲天堂va | 亚洲午夜久久久久久久久久久 | 国产午夜精品福利视频 | 美女视频永久黄网站免费观看国产 | www..com毛片 | 精品国产一区二区三区男人吃奶 | 六月色婷婷 | 婷婷天天色 | 国产高清黄 | 天天天在线综合网 | 中文字幕精品一区久久久久 | 亚洲综合色丁香婷婷六月图片 | 久久无码精品一区二区三区 | 韩日av一区二区 | 国产精品欧美久久久久久 | 中文伊人 | 日韩a欧美| 在线观看视频在线观看 | 亚洲高清av | 一区国产精品 | 中文字幕一区二区三区乱码不卡 | 日日干干夜夜 | 亚洲精品欧洲精品 | 国产在线91在线电影 | 亚洲日韩精品欧美一区二区 | 日韩久久在线 | 男女视频91| 四虎影视成人永久免费观看亚洲欧美 | 日韩动漫免费观看高清完整版在线观看 | 日韩视| 亚洲精品国产欧美在线观看 | 久久久精品二区 | 天天射天天操天天 | 青青河边草免费直播 | 精品福利在线视频 | 国产精品ⅴa有声小说 | 亚洲精品在线二区 | 国产日韩欧美在线观看视频 | 欧美一级视频免费看 | www.com黄色 | 四虎免费av| 97在线视| 五月婷婷狠狠 | 亚洲va综合va国产va中文 | 久精品视频在线观看 | 性色视频在线 | 五月天久久狠狠 | 免费a视频在线 | 久久国产精品成人免费浪潮 | 国产字幕在线看 | 精品毛片在线 | 热热热热热色 | 亚洲伦理一区 | 亚洲午夜不卡 | 国产在线播放一区二区 | 亚洲 综合 激情 | 欧美精品亚洲二区 | 久久超碰97 | 五月婷丁香 | 久久99国产综合精品 | 久久丁香网 | 久久综合电影 | 一区二区三区动漫 | 久久久久www | av黄在线播放 | 在线视频电影 | 精品电影一区二区 | 亚洲精品视频中文字幕 | 日韩精品视频在线观看网址 | 丁香高清视频在线看看 | 狠狠亚洲| 国产精品日韩久久久久 | 国产高清久久 | 在线中文日韩 | 丰满少妇高潮在线观看 | 黄色app网站在线观看 | 日日操天天爽 | 四虎在线免费观看 | 蜜臀av夜夜澡人人爽人人 | 国产a国产 | 精品国产乱码久久久久久天美 | 99热手机在线观看 | 久久中文字幕视频 | 欧美另类调教 | 高清av免费一区中文字幕 | 黄色片免费电影 | 久久久久久久久久久精 | 国产96精品 | 91成人精品一区在线播放69 | 日韩电影一区二区在线观看 | 色中文字幕在线观看 | 免费看色视频 | 日韩在线观看中文 | 国产伦理久久精品久久久久_ | 日韩在线观看三区 | 欧美日韩在线精品一区二区 | 国产美女被啪进深处喷白浆视频 | 91成人看片| 午夜视频免费在线观看 | 玖玖999| 中文字幕在线观看免费高清完整版 | 人人澡人人草 | 91.麻豆视频| 精品久久在线 | 开心色插 | 中文乱幕日产无线码1区 | 日韩中文在线观看 | 麻豆 free xxxx movies hd| 九九久久电影 | 97精品国自产拍在线观看 | 黄色日本免费 | 免费男女羞羞的视频网站中文字幕 | 黄色动态图xx | 久久久久久久久精 | 天天天综合 | 日韩精品一区二区在线观看视频 | 久久伊99综合婷婷久久伊 | 少妇高潮冒白浆 | 国产网红在线观看 | 久久精品视频在线 | 黄网站a | 国产伦理一区二区三区 | 亚洲精品乱码久久久久久9色 | 国产在线观看 | 99久久精品网 | 久草在线资源观看 | 99热网站| 亚洲欧美一区二区三区孕妇写真 | 六月激情婷婷 | 毛片视频网址 | av大片网址 | 中文字幕精品三级久久久 | 狠狠色丁香久久综合网 | 韩国精品一区二区三区六区色诱 | 亚洲理论电影 | 日韩欧美在线高清 | 国产亚洲精品久久网站 | a级国产乱理伦片在线观看 亚洲3级 | 夜色成人av | 在线婷婷 | 久久99热国产| www.激情五月.com | 成片免费观看视频大全 | 亚洲综合色站 | 欧美激情精品久久久久久免费 | 精品视频资源站 | 中文字幕在线日亚洲9 | 91视频高清 | 国产午夜精品理论片在线 | 麻豆传媒视频在线播放 | 播五月综合 | 91网页版在线观看 | 日日操网站| 天天射夜夜爽 | av在线网站观看 | 精品专区一区二区 | 69亚洲视频 | 一个色综合网站 | 久久国产精品99国产 | 91你懂的| 日韩激情久久 | 国产精品11 | 亚洲国产激情 | 九九综合久久 | 一区二区欧美激情 | 天天爱天天舔 | av女优中文字幕在线观看 | 欧美精品一二 | 国产在线精品一区二区三区 | 麻豆影视在线观看 | 最近更新中文字幕 | 99久久婷婷国产综合精品 | 日韩精品一区二区三区免费观看 | 91视频在线免费下载 | 亚洲国产欧美在线人成大黄瓜 | 高清不卡毛片 | 免费高清国产 | 又黄又爽的免费高潮视频 | 狠狠操天天干 | 91人人爽久久涩噜噜噜 | 欧美日韩亚洲在线观看 | 中文字幕在线国产精品 | 欧美精品乱码久久久久 | 六月丁香婷婷网 | 久久国产精品99久久久久久老狼 | 97在线观看免费 | 正在播放五月婷婷狠狠干 | 国产区精品在线 | 欧美成年性| 在线观看午夜av | 中文字幕在线字幕中文 | 久久狠狠一本精品综合网 | 久久国产精品色av免费看 | 久久兔费看a级 | 天天爱天天爽 | 91精品久久久久久久久久久久久 | 日韩在线观看影院 | 尤物九九久久国产精品的分类 | 最新av中文字幕 | 久久久高清视频 | 91豆花在线观看 | 99久久精品视频免费 | 在线观看中文字幕第一页 | 亚洲精品乱码久久久久久 | 国产精品 9999 | 亚洲影院天堂 | 一本—道久久a久久精品蜜桃 | 国内精品久久久久久久久久 | 欧洲精品在线视频 | 手机看片午夜 | 热99在线视频 | 91视频首页 | 国产99在线播放 | 精品国产片| 中文网丁香综合网 | 国产成人久久精品一区二区三区 | 成人午夜影院在线观看 | 一级黄色免费网站 | 在线免费色 | 综合网天天射 | aa一级片| 成人午夜精品久久久久久久3d | 2018好看的中文在线观看 | 97福利在线 | 人人舔人人| 国产一区二区三区黄 | 国产五月婷婷 | 日韩在线色视频 | 免费在线观看日韩视频 | 亚洲色五月 | 91九色国产视频 | 久久中文字幕视频 | 黄在线免费看 | 91一区啪爱嗯打偷拍欧美 | 在线免费观看不卡av | 亚洲视频综合 | 亚洲免费观看视频 | 六月丁香婷 | 久久久精品国产免费观看同学 | 久久久久久久电影 | 色激情五月| 999视频在线播放 | 亚洲情感电影大片 | 97色在线观看免费视频 | 久久观看免费视频 | 亚洲精品小视频在线观看 | 久精品视频在线观看 | 欧美精品久久人人躁人人爽 | 黄色三级免费 | 婷婷丁香久久五月婷婷 | 国产视频资源 | 高清av在线| 97视频亚洲| 久久久久久网 | av网站有哪些 | 亚洲专区欧美 | 五月婷婷综合在线观看 | 最近中文字幕视频网 | 精品久久久久久国产偷窥 | 成人免费xyz网站 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 三级黄色网址 | 日韩激情视频在线观看 | 国产人成看黄久久久久久久久 | 免费手机黄色网址 | 9i看片成人免费看片 | 成人免费网站在线观看 | 午夜色大片在线观看 | 黄色大全免费网站 | 中文字幕亚洲欧美日韩 | 中文字幕美女免费在线 | 国产韩国精品一区二区三区 | 97精品国产一二三产区 | 日韩免费在线观看网站 | 久久久久免费看 | 亚一亚二国产专区 | 欧美a级在线免费观看 | 成年人黄色在线观看 | 中文视频一区二区 | 久热这里有精品 | 久久久国产精品免费 | 久久国产一二区 | 欧美一区免费观看 | 久久国产精品99久久人人澡 | 精品一区二三区 | 少妇bbbb| 九色91福利 | 欧美激情精品久久久 | 一区二区不卡高清 | 日韩精品一区二区在线 | 免费中文字幕在线观看 | 欧美性受极品xxxx喷水 | 97超碰人人爱 | av 一区二区三区 | 婷婷综合成人 | 日韩在线观看a | 日本系列中文字幕 | 国产午夜影院 | 国产精品免费一区二区三区 | 91精品一区二区三区蜜臀 | 日韩免费一区 | 懂色av懂色av粉嫩av分享吧 | 日韩视频免费观看高清完整版在线 | 狠狠操狠狠插 | 久久久综合九色合综国产精品 | 91成人在线观看高潮 | 在线观看日本高清mv视频 | 日韩欧美电影在线 | 日韩在线免费看 | 69久久夜色精品国产69 | 国产精品视频最多的网站 | 天天射网站| 国产在线视频导航 | 国产精品成人自拍 | av一级在线观看 | 久草在线视频网 | 丝袜制服天堂 | 99视频在线 | 不卡电影一区二区三区 | www国产亚洲精品久久网站 | 91在线影视| 国产韩国日本高清视频 | 99精品亚洲 | 夜夜操天天干 | www色,com| 久久天天综合网 | 91成人免费观看视频 | 欧美一级片免费观看 | 超碰在线国产 | 一级黄色电影网站 | 天堂网一区二区 | 亚洲一区免费在线 | 91视频一8mav| 成人av电影免费在线观看 | 91精品久久久久久综合乱菊 | 国产精品激情偷乱一区二区∴ | 久久综合久久鬼 | 2023天天干 | 日韩欧美在线观看一区二区三区 | 99色在线观看视频 | 亚洲精品看片 | 久久久久久久久久久久电影 | 国产99久久九九精品免费 | 亚州精品在线视频 | 国产伦精品一区二区三区无广告 | 三级在线视频播放 | 欧美日韩国产免费视频 | 精品国产乱码久久久久久浪潮 | 99夜色| 永久免费毛片在线观看 | 日韩久久久久久久久久久久 | 亚洲一区不卡视频 | 91精品啪在线观看国产线免费 | 久久欧美精品 | 国产中的精品av小宝探花 | 99久久久国产精品免费99 | 国产无遮挡又黄又爽在线观看 | 国产精品你懂的在线观看 | 欧美性色综合网站 | 网站在线观看你们懂的 | 伊人天天| 亚洲影院天堂 | 一本一本久久a久久精品牛牛影视 | 免费黄色a网站 | 国产日韩视频在线 | 国产麻豆传媒 | 国产亚洲视频中文字幕视频 | 999久久久国产精品 高清av免费观看 | 国产精品久久久影视 | 久久国产精品99久久久久久老狼 | 免费在线视频一区二区 | 亚洲情感电影大片 | 亚洲国产精品999 | 色婷婷视频在线观看 | 久久一区二区三区超碰国产精品 | 精品在线一区二区三区 | 一区二区伦理 | 免费观看91 | 热久在线 | 久久av电影 | 久久午夜国产精品 | a色网站| 九九久久久久久久久激情 | 日韩夜夜爽| 国产999精品 | 操操爽| 日韩免费视频观看 | 国产成人高清 | 91精品国产99久久久久 | 在线观看视频一区二区三区 | 国产va精品免费观看 | 热久久99这里有精品 | 亚洲伊人av | 欧美激情另类文学 | av免费看av| 色91在线 | 亚洲成av人片在线观看 | av看片网 | 女女av在线 | 亚洲涩涩一区 | 亚洲精品av中文字幕在线在线 | japanese黑人亚洲人4k | 91九色蝌蚪在线 | 欧美精品一区二区性色 | av性网站| 国内视频在线 | 日本一区二区高清不卡 | 久久乐九色婷婷综合色狠狠182 | 色av资源网| 久久综合视频网 | 久久96国产精品久久99软件 | 日韩av男人的天堂 | 日日草天天草 | 天天综合网久久综合网 | 免费视频三区 | 免费a网址 | 黄色成年网站 | 美女视频黄色免费 | 国产精品久久片 | 99久久久国产精品美女 | 二区中文字幕 | 又长又大又黑又粗欧美 | 久草免费在线观看 | 色婷婷欧美 | 欧美国产精品一区二区 | 日韩有码在线播放 | 久久免费一 | 国产精品男女视频 | 国产精品综合久久久 | 久久免费久久 | 狠狠插狠狠操 | 看片的网址| 欧美性生活一级片 | 国产视频在线观看一区 | 久草精品在线观看 | 天天综合狠狠精品 | 丝袜美女视频网站 | 亚洲精品视频在线观看免费 | 黄色91免费观看 | 国产精品免费久久久久久 | 亚洲精品成人在线 | 这里只有精彩视频 | 色橹橹欧美在线观看视频高清 | 久久国产欧美日韩精品 | 成人免费视频a | 久久伊人国产精品 | zzijzzij亚洲成熟少妇 | 91av免费在线观看 | av在线日韩 | 日韩在线视频网址 | 91伊人影院 | 九月婷婷色 | 999久久久免费精品国产 | 九九九视频精品 | 国产成人精品久久久久蜜臀 | 国产亚洲精品久久久久久 | 五月开心激情 | 91高清免费看 | 丁香视频在线观看 | 中文字幕日韩精品有码视频 | 99精品久久只有精品 | av在观看 | 超级碰碰碰免费视频 | 综合网久久 | 99国产情侣在线播放 | 国产成人精品一区二区三区在线观看 | 香蕉在线播放 | 色综合久久88色综合天天免费 | 亚洲天天看 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 国产在线中文 | 色婷婷精品 | 欧美日韩精品在线免费观看 | 日韩美女av在线 | 91av视频免费观看 | 91精品国产高清自在线观看 | 麻豆传媒在线视频 | 国产精品精品久久久久久 | 69精品在线观看 | 天天摸天天舔 | 99 色 | 深夜福利视频一区二区 | 免费观看9x视频网站在线观看 | 有码视频在线观看 | 久久人人爽人人爽人人片av免费 | 丁香五香天综合情 | 成人理论在线观看 | 97理论电影 | 香蕉网在线观看 | 九色91视频 | 一区二区三区日韩在线观看 | 久久激情小说 | 亚洲一级片| 在线观看免费观看在线91 | 色资源网在线观看 | 午夜免费福利视频 | 又黄又爽免费视频 | 91丨九色丨高潮 | 国产一区二区三区免费在线 | 亚洲天堂网视频在线观看 | 成人午夜剧场在线观看 | 99国产在线视频 | 免费在线观看成人 | 亚洲国产高清在线观看视频 | 国产成人在线网站 | 久久精品国产99国产 | 91精品国产高清自在线观看 | av青草 | 色精品视频| 久久嗨| 青青草视频精品 | 国产精品久久久久久久久久东京 | 91在线最新| 最新av在线网站 | 久草国产在线观看 | 国产中文字幕在线播放 | 国产专区视频在线观看 | 天天av综合网 | 丝袜av网站| 免费黄色在线网址 | 精品成人免费 | 久久久久亚洲国产 | 成人免费观看在线视频 | 99视频网站 | 91成年人在线观看 | 日本精品免费看 | 国产中文字幕亚洲 | 黄www在线观看 | 色综合天天色综合 | 欧美在线一 | 国产一级一片免费播放放 | 日韩在线精品 | 久久国语 | 亚洲精品在线免费播放 | 成人午夜在线观看 | 最近2019好看的中文字幕免费 | av成人亚洲 | 黄色资源在线观看 | 成人午夜片av在线看 | 九九精品无码 | 天天干干 | 日韩免费在线 | 13日本xxxxxⅹxxx20| 天天操天天操天天爽 | 最新色站 | 午夜精品久久久 | 国产精品 国产精品 | 免费观看9x视频网站在线观看 | 国产精品99久久99久久久二8 | 黄网av在线| 成人在线视频免费观看 | 97视频播放 | 一区二区在线影院 | 亚洲在线 | 好看的国产精品视频 | 免费av大全 | 丁香5月婷婷久久 | 亚洲va欧美va人人爽 | 国产电影一区二区三区四区 | 国产精品理论在线观看 | www九九热| 一区二区中文字幕在线播放 | 一本一本久久a久久精品综合妖精 | 欧美一级免费 | 精久久久久 | 男女激情网址 | 欧美在线不卡一区 | 西西444www高清大胆 | 亚洲黄色在线 | 国产中文字幕91 | 四虎天堂 | 国产精品va| 在线视频你懂得 | 中文字幕在线久一本久 | www.玖玖玖| 精品国产精品国产偷麻豆 | 国产精品一区二区免费 | 激情欧美一区二区免费视频 | 午夜三级影院 | 国产又黄又爽又猛视频日本 | 亚洲理论在线 | 激情婷婷在线观看 | 天天操天天拍 | 亚洲成人免费观看 | 日本狠狠干 | 激情欧美国产 | 婷婷六月在线 | 国产录像在线观看 | 久久久久免费精品国产 | 亚欧日韩成人h片 | 91色一区二区三区 | 天天干,天天射,天天操,天天摸 | 亚洲国产网址 | www178ccom视频在线| 国产69久久久欧美一级 | 91在线看| 婷婷播播网 | 国产精品夜夜夜一区二区三区尤 | 久久超级碰 | 日本黄色黄网站 | 美女福利视频网 | 久久精品视频一 | 玖玖在线视频观看 | 亚洲特级毛片 | 草免费视频 | 2023年中文无字幕文字 | 黄影院| 99久久久久国产精品免费 | 国产尤物视频在线 | 热久久免费视频 | 成人毛片在线视频 | 亚洲欧美成人在线 | 国产丝袜 | 国产一区av在线 | 91香蕉亚洲精品 | 国产精品视频免费 | 一区二区三区在线影院 | 久久久久久久久久久国产精品 | 玖玖在线播放 | 国产精品v欧美精品v日韩 | 一本一本久久a久久精品综合 | 一区二区视频在线免费观看 | 欧美一二三区在线播放 | 在线看av的网址 | 天天添夜夜操 | 黄色大全免费网站 | 亚洲最大色 | 国产亚洲精品久久久久久电影 | 午夜精品福利在线 | 91视频3p| 91最新网址在线观看 | 免费在线观看av网址 | 涩涩网站在线看 | 天天操伊人 | 久久综合久久综合这里只有精品 | 草免费视频 | 国产精品色 | 最新av在线播放 | 亚洲精品合集 | 99视频在线精品免费观看2 | 亚洲第一色 | 国产精品久久久久久久久免费看 | 精品视频在线免费观看 | 91香蕉嫩草 | 日日操天天操夜夜操 | 丰满少妇高潮在线观看 | 久久五月婷婷丁香社区 | 日韩欧美在线不卡 | 久久久久草 | 日韩av女优视频 | 亚洲一级电影 | 欧美日韩在线看 | 91精品国产91p65| 久久久久欧美精品999 | 在线看av的网址 | 久久中文字幕视频 | 国产日产在线观看 | 91视频午夜 | 五月激情久久久 | 天天干天天做 | 国内视频在线观看 | 五月天激情综合 | 久久精品站 | 麻花天美星空视频 | 久久国产免费看 | 激情黄色一级片 | 蜜臀av性久久久久蜜臀av | 亚洲精品高清视频在线观看 | 久久午夜色播影院免费高清 | 久久婷婷激情 | 亚洲一区网 | 十八岁以下禁止观看的1000个网站 | 热re99久久精品国产66热 | 久久99精品久久久久久 | 免费在线观看不卡av | www.com黄 | 伊人伊成久久人综合网小说 | 久久黄色成人 | 97小视频 | 91精品入口 | 天天玩天天干天天操 | 日韩在线一区二区免费 | 91热在线| 国产高清视频在线观看 | 免费网址你懂的 | 国产女人免费看a级丨片 | 色综合久久久久综合体桃花网 | 日本中文字幕久久 | 91九色成人蝌蚪首页 | 日本精品一二区 | 91精品国产综合久久福利不卡 | 91在线观| 一区二区三区免费播放 | 天天操偷偷干 | 欧美日韩精品区 | 日韩大片在线播放 | 久久久三级视频 | 国产精品一区二区在线播放 | 国产一区二区在线播放 | 国产91电影在线观看 | 日韩一级成人av | 激情偷乱人伦小说视频在线观看 | 国产一级片在线播放 | 中文字幕在线电影 | 月丁香婷婷 | 狠狠色丁香婷婷综合久久片 | 国产免码va在线观看免费 | av电影免费在线播放 | 中文字幕乱码在线播放 | 国产精品一区二区吃奶在线观看 | 欧美一二三区播放 | 丁香久久综合 | 久久高视频| 国产一区在线视频 | 亚洲国产日韩欧美在线 | 九九热视频在线免费观看 | 亚洲精品字幕在线观看 | 国产高清不卡一区二区三区 | 亚洲成人精品影院 | www.一区二区三区 | 色多多视频在线 | 天天做天天爱天天爽综合网 | 三级黄色免费片 | 国产激情小视频在线观看 | 亚洲视频h | 久久国语露脸国产精品电影 | 日韩在线电影观看 | 国产成人久久av977小说 | 中文在线中文资源 | 亚洲精品视频网站在线观看 | 久草在线中文视频 | 国产九九精品视频 | 久草视频首页 | 国产手机在线播放 | 激情综合一区 | 久久成人高清视频 | 婷婷干五月 | av中文在线 | 欧美日产在线观看 | 成人福利av| 国产精品久久久影视 | 激情综合网五月 | 国产成人久| 不卡国产视频 | 91大神精品视频在线观看 | 国产 日韩 欧美 中文 在线播放 | 麻豆国产在线播放 | 黄色三级免费 | 久久精品九色 | 91视频 - v11av| 综合天天色 | 亚州国产精品 | 深夜免费小视频 | 91精品国产综合久久福利不卡 | 欧美色精品天天在线观看视频 | 91九色网站| 久久久香蕉视频 | 国产在线a不卡 | 国内丰满少妇猛烈精品播 | 天堂av中文字幕 | 狠狠狠的干 | 亚洲精品视频在 | 69久久99精品久久久久婷婷 | 国模精品一区二区三区 | 久久久久久久久久久久久久电影 | 五月婷婷黄色网 | 国产剧情av在线播放 | 97超在线| 亚洲欧美精品一区二区 | 最新国产精品拍自在线播放 | 日韩中文字幕免费在线播放 | 精品国产精品久久 | 黄网站污 | 亚洲精品高清视频 | 欧美日韩另类在线观看 | 最新国产精品亚洲 | 欧美精品一区二区免费 | 久久久久久久久久电影 | 国产精品久久久久久爽爽爽 | 日韩激情第一页 | 日日操天天爽 | 美女免费黄视频网站 | 日本中文字幕在线播放 | 久久99久久99精品免视看婷婷 | 精品伊人久久久 | 国产美女精品视频免费观看 | 91激情在线视频 | 亚洲人人射 | 黄色一级在线视频 | 色综合久久久久久久久五月 | 精品1区2区| 欧美日韩视频在线 | 国产一区视频在线观看免费 | 免费在线观看国产精品 | 久久99精品久久只有精品 | 久久综合狠狠综合久久综合88 | 韩国av一区二区三区在线观看 | 日韩一二三区不卡 | 亚洲综合小说 | 精品影院 | 四虎成人免费观看 | 国产精品二区在线观看 | 欧美三级高清 | 超碰九九| 最近能播放的中文字幕 | 久久久伦理 | 成年美女黄网站色大片免费看 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲欧美成人综合 | 亚洲婷婷综合色高清在线 | 欧美视频xxx | 日韩高清一二区 | 欧美日韩a视频 | 欧美日韩裸体免费视频 | 六月色丁香| 日韩av成人在线观看 | 免费观看黄色av | 国产一区二区免费 | 在线99视频 | 99九九免费视频 | 香蕉国产91 | 国产啊v在线观看 | 美女精品在线 | 国产视频网站在线观看 | 日本公妇在线观看 | 久久爽久久爽久久av东京爽 | 日本精品中文字幕在线观看 | 波多野结衣亚洲一区二区 | 日韩欧美视频在线免费观看 | 美女网站视频久久 | 另类老妇性bbwbbw高清 | 久久99久久99精品免观看软件 | 精品视频久久久久久 | 国产黄色片在线 | 在线 国产一区 | 久久久精品一区二区三区 | 在线观看亚洲精品视频 | 不卡中文字幕av | 99精品视频一区 | 国语对白少妇爽91 | 国产精品中文字幕在线 | 久久草在线视频国产 | 精品专区一区二区 | 一区二区中文字幕在线 | 超碰在线国产 | 欧洲激情在线 | 久久久免费视频播放 | 中文字幕在线日 | 天天爱天天 | 久久婷亚洲五月一区天天躁 | 国产a国产| 这里只有精品视频在线观看 | 国产精品一区二区在线观看免费 | 国内精品久久久久影院男同志 | 天操夜夜操 | 午夜av色 | 国产精品乱看 | 狠狠久久婷婷 | 国产高清永久免费 | 亚洲综合色丁香婷婷六月图片 | av电影久久 | 欧美日韩视频 | 99久久国产免费免费 | 日韩免费在线观看 | 91亚洲精品久久久蜜桃借种 | 国产精品手机视频 | 天天天在线综合网 | 国产一级黄色免费看 | 日韩在线视 | 免费看十八岁美女 | 天天干天天操天天射 | 国产一二三精品 | 日本3级在线观看 | 日韩av有码在线 | 亚洲另类久久 | 天天艹日日干 | 亚洲理论视频 | 国产男女无遮挡猛进猛出在线观看 | 亚洲综合精品视频 | av电影免费 | 奇米影视在线99精品 | 久久理论电影网 | 精品欧美一区二区三区久久久 | 免费日韩一区二区三区 | 国产91影院 | 激情开心站 | 亚洲精品一区二区18漫画 | 在线成人av | 久久99久久99精品免观看软件 | 黄色高清视频在线观看 | 波多野结衣理论片 | 97在线看片 | 青青河边草免费直播 | 亚洲做受高潮欧美裸体 | 一区二区毛片 | 精品一区二区在线播放 | 成人h视频| 在线观看日韩视频 | 综合在线色 | 狠狠色噜噜狠狠狠合久 | 99精品国产福利在线观看免费 | 久久精品中文视频 | 婷婷激情在线观看 | 成人国产一区二区 | 国产精品一区二区62 | 午夜三级福利 | 久久精品国产第一区二区三区 | 亚洲欧美国产视频 | 在线中文字幕电影 | 国产精品成人久久 | 亚洲免费在线观看视频 | 深爱激情站 | 久久精品电影 | 欧美成人性网 | 在线亚洲播放 | 成人欧美一区二区三区在线观看 | 又黄又爽的免费高潮视频 | 美女网站免费福利视频 | 国产韩国日本高清视频 | 亚洲综合在线一区二区三区 | 91人人澡人人爽人人精品 | 国产18精品乱码免费看 | 成人在线黄色电影 | www日韩视频 | 美女很黄免费网站 | 狠狠狠干狠狠 | 国产精品一区二区三区在线 | 国产一级片网站 | 在线视频中文字幕一区 | 西西4444www大胆视频 | 中文字幕在线精品 | 成人免费 在线播放 | 日本视频久久久 | 超碰av在线播放 | 在线免费观看黄色av | 成人h电影 | 五月婷婷在线播放 | 91麻豆看国产在线紧急地址 | 亚洲日本一区二区在线 | 欧美特一级片 | 日韩欧美视频一区二区三区 | 久久欧美视频 | 五月天综合| 国产一区二区三区 在线 | 九九免费观看视频 | 超碰在线97免费 | 日韩va在线观看 | 黄色免费大片 | 免费av片在线 | 国产伦理久久精品久久久久_ | 999精品网 | 精品国产一区二区三区男人吃奶 | 日韩精品一区二区在线视频 | 日韩国产在线观看 | 欧美韩日在线 | 国产亚洲视频在线免费观看 | 欧美99精品| 亚洲精品国产精品99久久 | 91高清完整版在线观看 | 夜夜操天天摸 | 亚洲精品黄网站 | 国产91成人 | 黄色免费大片 | 日韩国产精品一区 | 久久久久久久亚洲精品 | 奇米网在线观看 | 成年美女黄网站色大片免费看 | 香蕉97视频观看在线观看 | 久久人人爽人人爽人人片 | 亚洲国产精品小视频 | 精品欧美一区二区精品久久 | 精品一区电影 | 日韩精品视频网站 | 亚洲精品永久免费视频 | 日韩精品免费一区 | 日韩在线免费小视频 | 久久成人在线视频 | av免费在线网站 | 国产护士在线 | 久久伦理电影 | 国产成人一区二区在线观看 | 国精产品满18岁在线 | 国产美女免费观看 |