<small id='WXaN8'></small> <noframes id='hTJDzNjk47'>

  • <tfoot id='dMOf'></tfoot>

      <legend id='RwQak0zK'><style id='vHniV2'><dir id='ni0VI'><q id='fHL1cST'></q></dir></style></legend>
      <i id='mzyQxs'><tr id='ugWL2iN'><dt id='ijInu'><q id='gm42'><span id='Oa5Gf'><b id='MN0ZyR'><form id='1Tf8ro'><ins id='dpgn'></ins><ul id='OUNS9spq3'></ul><sub id='YhBZGOfd'></sub></form><legend id='lis9X'></legend><bdo id='qzvGWncLB'><pre id='hBHIWvJ89Q'><center id='xaDPoV6mH'></center></pre></bdo></b><th id='MtGBcL'></th></span></q></dt></tr></i><div id='Z1USqWL0s'><tfoot id='jrXHoZ'></tfoot><dl id='HJeVn'><fieldset id='J8lsAVG'></fieldset></dl></div>

          <bdo id='w3j20'></bdo><ul id='LScIbza'></ul>

          1. <li id='jP0ihoVW4'></li>
            登陆

            Java 上传解压zip文件,而且解析文件里边的excel和图片

            admin 2019-11-20 163人围观 ,发现0个评论

            需求:上传一个zip文件,zip文件里边包含一个excel和许多图片,需求把excel里边的信息解析出来保存到表中,一起图片也转化成base64保存到数据库表中。

            PS:为了便利不同水平的开发人员阅览,我把代码悉数写到Controller里边。这个demo的file入参的类型是MultipartFile,许多网上的比如是File类型。这两个类型在解析文件的时分仍是有点差异的。

            第①个办法:

            1 /**

            2 * 这个deomo入参的类型是MultipartFile,许多网上的比如是File类型

            3 * @param file (zip)

            4 * @param request

            5 * @param response

            6 * @return

            7 * @throws Exception

            8 */

            9 @PostMapping("/addPersonsFileOfZip")

            10 public String addPersonsFileOfZip(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {

            11 String createdId = request.getParameter(KEY_CREATED_ID);

            12 //正常上这儿需求检查一下createdId是否为空

            13

            14 //原则上这个uploadZipFilesAndParse办法需求写到service和serviceImpl中

            15 String result =uploadZipFilesAndParse(file,createdId);

            16 return result;

            17 }

            第②个办法:

            1 /**

            2 *回来的是批次号

            3 *一起我别的开了线程处理zip文件里边的图片和excel,

            4 */

            5 @Override

            6 public String uploadZipFilesAndParse(MultipartFile file, String createdId) throws Exception {

            7 String filename = file.getOriginalFilename();

            8 String fileType = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(Locale.US);

            9 String uuid = UUID.randomUUID().toString();

            10 //判别文件是不是zip类型

            11 if(fileType.equals("zip")){

            12

            13 //FileConfig.localtion是配置文件和config类出产的,我会在谈论区附上这些代码,测验demo的时分我们能够直接把FileConfig.localtion替换成D:/test

            14 //String desPath = FileConfig.localtion + File.separator + uuid.replaceAll("-", "");

            15 String desPath = "D:/test" + File.separator + uuid.replaceAll("-", "");

            16

            17

            18 //下面这三行的代码便是把上传文件copy到服务器,必定不要遗漏了。

            19 //遗漏了这个代码,在本地测验环境不会出问题,在服务器上必定会报没有找到文件的过错

            20 String savePath = FileConfig.localtion + File.separator;

            21 File savefile = new File(savePath+filJava 上传解压zip文件,而且解析文件里边的excel和图片ename);

            22 file.transferTo(savefile);

            23

            24 FileUtil fileUtil = new FileUtil();

            25 //解压zip文件,我是写在公共类里边,FileUtil类代码谈论区见

            26 FileUtil.unZip(file, desPath,savePath);

            27 new Thread(new Runnable() {

            28 @Override

            29 public void run() {

            30 List fileList = new ArrayList<>();

            31 fileList = fileUtil.getSubFiles(desPath,fileList);

            32 for (File oneFile : fileList){

            33 if (oneFile.getName().toLowerCase().endsWith(".xls") || oneFile.getName().toLowerCase().endsWith(".xlsx") ) {

            34 try {

            35 //解析处理excel文件

            36 parseExcelFile(oneFile,createdId,uuid);

            37 } catch (Exception e) {

            38 LogUtils.error(e.getMessage());

            39 }

            40 }else if(oneFile.getName().toLowerCase().endsWith(".jpg")) {

            41 try {

            42 //解析处理图片文件

            43 parseImageFile(oneFile,createdId,uuid);

            44 } catch (Exception e) {

            45 LogUtils.error(e.getMessage());

            46 }

            47 }

            48 }

            49

            50 //最终要删去文件,删去文件的办法见谈论区FileUtil类

            51 FileUtil.clearFiles(desPath);

            52

            53 }

            54 }).start();

            55

            56 }

            57 return uuid;

            58 }

            View Code

            第③个办法:解压zip文件的unzip办法

            1 public static void unZip(MultipartFile srcFile, String destDirPath,String savePath) throws RuntimeException, IOException {

            2 long startTime = System.currentTimeMillis();

            3

            4 File file = null;

            5 InputStream ins = srcFile.getInputStream();

            6 file=new File(savePath+srcFile.getOriginalFilename());

            7 LogUtils.info("MultipartFile transform to File,MultipartFile name:"+srcFile.getOriginalFilename());

            8 inputStreamToFile(ins, file);

            9

            10 if (!file.exists()) {

            11 throw new RuntimeException(file.getPath() + ",file is not found");

            12 }

            13 ZipFile zipFile = null;

            14 try {

            15 zipFile = new ZipFile(file);

            16 Enumeration

            17 while (entries.hasMoreElements()) {

            18 ZipEntry entry = (ZipEntry) entries.nextElement();

            19 LogUtils.info("zipFile context name:"+entry.getName());

            20 if (entry.isDirectory()) {

            21 String dirPath = destDirPath + File.separator+ entry.getName();

            22 File dir = new File(dirPath);

            23 dir.mkdirs();

            24 }else {

            25 File targetFile = new File(destDirPath + File.separator + entry.getName());

            26 targetFile.setExecutable(true);

            27 if(!targetFile.getParentFile().exists()){

            28 targetFile.getParentFile().mkdirs();

            29 }

            30 targetFile.createNewFile();

            31 InputStream is = zipFile.getInputStream(entry);

            32 FileOutputStream fos = new FileOutputStream(targetFile);

            33 int len;

            34 byte[] buf = new byte[1024];

            35 while ((len = is.read(buf)) != -1) {

            36 fos.write(buf, 0, len);

            37 }

            38 fos.close();

            39 is.close();

            40 }

            41 }

            42 long endTime = System.currentTimeMillis();

            43 LogUtils.info("unZip time-->" + (endTime - startTime) + " ms");

            44 }catch(Exception e) {

            45 throw new RuntimeException("unzip error from FileUtil", e);

            46 } finally {

            47 if(zipFile != null){

            48 try {

            49 zipFile.close();

            50 } catch (IOException e) {

            51 e.printStackTrace();

            52 }

            53 }

            54

            55 //MultipartFile change to file may create a temp file in the project root folder(delete the temp file)

            56 File del = new File(file.toURI());

            57 del.delete();

            58 }

            59 }

            View Code

            第④个办法:unzip办法中的inputStreamToFile办法,这个办法的意图是把MultipartFile转成File类型,可是会在项目根目录下生成一个临时文件,切记要删去

            1 private static void inputStreamToFile(InputStream ins, File file) {

            2 try {

            3 OutputStream os = new FileOutputStream(file);

            4 int bytesRead = 0;

            5 byte[] buffer = new byte[8192];

            6 while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {

            7 os.write(buffer, 0, bytesRead);

            8 }

            9 os.close();

            10 ins.close();

            11 LogUtils.info("MultipartFile transform to File completed!");

            12 }catch(Exception e) {

            13 e.printStackTrace();

            14 }

            15 }

            View Code

            第⑤个办法:parseExcelFile办法是解析excel的办法,里边包含我自己项意图逻辑处理,我们能够删去这些代码,只保存解析excel的代码就好

            1 private void parseExcelFile(File file,String createdId,String uuid) throws Exception {

            2

            3 LogUtils.info("file name:"+file.getName());

            4 FileInputStream is = new FileInputStream(file);

            5 Workb德德玛ook workbook = WorkbookFactory.create(is);

            6 Sheet sheet = workbook.getSheetAt(0);

            7

            8 int firstRowIndex = sheet.getFirstRowNum() + 1;

            9 int lastRowIndex = sheet.getLastRowNum();

            10

            11 List batchPersonList = new ArrayList<>();

            12 for (int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) {

            13

            14 VapBatchPersonInfo vapBatchPersonInfo = new VapBatchPersonInfo();

            15 Row row = sheet.getRow(rIndex);

            16 if (row != null) {

            17 int firstCellIndex = row.getFirstCellNum();

            18 int lastCellIndex = row.getLastCellNum();

            19 JSONObject jsonObject = new JSONObject();

            20 jsonObject.put(KEY_CREATED_ID, createdId);

            21

            22 Cell resultCell = row.createCell(lastCellIndex);

            23 Cell msgCell = row.createCell(lastCellIndex + 1);

            24 Boolean flag = false;

            25 for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) {

            26 Cell cell = row.getCeJava 上传解压zip文件,而且解析文件里边的excel和图片ll(cIndex);

            27 String titleName = sheet.getRow(0).getCell(cIndex).toString();

            28 String checkTitleName = checkTitleName(cIndex, titleName);

            29 if (!"SUCCESS".equals(checkTitleName)) {

            30 msgCell.setCellValue(checkTitleName);

            31 resultCell.setCellValue("Failed");

            32 flag = true;

            33 break;

            34 }

            35 if (cell != null) {

            36 cell.setCellType(CellType.STRING);

            37 jsonObject.put(titleName, cell.toString());

            38 }

            39

            40 }

            41 if (flag) {

            42 rIndex = 0;

            43 lastRowIndex = 0;

            44 } else {

            45 vapBatchPersonInfo.setBatchNo(uuid);

            46 vapBatchPersonInfo.setName(jsonObject.getString("fullName"));

            47 vapBatchPersonInfo.setImageName(jsonObject.getString("imageName"));

            48 vapBatchPersonInfo.setConfidenceThreshold(jsonObject.getString("confidenceThreshold"));

            49 vapBatchPersonInfo.setCreatedId(jsonObject.getString("createdId"));

            50 vapBatchPersonInfo.setIdentityNo(jsonObject.getString("identityNo"));

            51 vapBatchPersonInfo.setCreatedDate(new Date());

            52 vapBatchPersonInfo.setLastUpdatedId(jsonObject.getString("createdId"));

            53 vapBatchPersonInfo.setLastUpdatedDate(new Date());

            54 vapBatchPersonInfo.setStatus(TaskStatus.RUNNING);

            55 batchPersonList.add(vapBatchPersonInfo);

            56 }

            57 }

            58 }

            59 batchPersonInfoRepository.saveAll(batchPersonList);

            60

            61 }

            View Code

            第⑥个办法:parseImageFile办法是解析图片的办法

            1 private void parseImageFile(File file, String createdId, String uuid) throws Exception {

            2

            3 String imgStr ="";

            4 FileInputStream fis = new FileInputStream(file);

            5 byte[] buffer = new byte[(int) file.length()];

            6 int offset = 0;

            7 int numRead = 0;

            8 while (offset < buffer.length && (numRead = fis.read(buffer, offset, buffer.length - offset)) >= 0) {

            9 offset += numRead;

            10 }

            11 if (offset != buffer.length) {

            12 throw new IOException("Could not completely read file " + file.getName());

            13 }

            14 fis.close();

            15 Base64 encoder = new Base64();

            16 imgStr = Base64.encodeBase64String(buffer);

            17 imgStr.length();

            18 LogUtils.info("file name:"+file.getName());

            19 // LogUtils.info("file imgStr:"+imgStr);

            20 // LogUtils.info("file imgStr.length:"+imgStr.length());

            21

            22 }

            View Code

            最终附上FileConfig和FileUtil的代码

            FileConfig代码:

            import org.springframework.boot.context.properties.ConfigurationProperties;

            import org.springframework.core.annotation.Order;

            import org.springframework.stereotype.Component;

            /**

            *Jun 12, 2019

            *

            * FileConfig.java

            */

            @ConfigurationProperties(prefix = "upload")

            @Component

            @Order

            public class FileConfig {

            public static String localtion;

            public static String maxFileSize;

            public static String maxRequestSize;

            /**

            * @param localtion the localtion to set

            */

            public void setLocaltion(String localtion) {

            FileConfig.localtion = localtion;

            }

            /**

            * @param maxFileSize the maxFileSize to set

            */

            public void setMaxFileSize(String maxFileSize) {

            FileConfig.maxFileSize = maxFileSize;

            }

            /**

            * @param maxRequestSize the maxRequestSize to set

            */

            public void setMaxRequestSize(String maxRequestSize) {

            FileConfig.maxRequestSize = maxRequestSize;

            }

            }

            View Code

            FileConfig类里边读取的配置文件信息:

            配置文件类型是yml,我们也能够自己改成properties文件格局

            upload:

            #localtion: ${UPLOAD_DIR:/home/data/test}

            localtion: ${UPLOAD_DIR:D:/test}

            maxFileSize: 10240KB

            maxRequestSize: 102400KB

            FileUtil类的代码:

            1 import java.io.*;

            2 import java.nio.channels.FileChannel;

            3 import java.nio.file.Files;

            4 import java.nio.file.Path;

            5 import java.nio.file.Paths;

            6 import java.nio.file.attribute.PosixFilePermission;

            7 import java.util.ArrayList;

            8 import java.util.Enumeration;

            9 import java.util.HashSet;

            10 import java.util.List;

            11 import java.util.Set;

            12 import java.util.zip.ZipEntry;

            13 import java.util.zip.ZipFile;

            14

            15 import org.springframework.web.multipart.MultipartFile;

            16

            17 import sg.com.mha.ummi.common.util.LogUtils;

            18

            19

            20 public class FileUtil {

            21

            22 public static void clearFiles(String workspaceRootPath) {

            23 File file = new File(workspaceRootPath);

            24 deleteFile(file);

            25 }

            26

            27 public static void deleteFile(File file) {

            28 if (file.exists()) {

            29 if (file.isDirectory()) {

            30 File[] files = file.listFiles();

            31 for (int i = 0; i < files.length; i++) {

            32 deleteFile(files[i]);

            33 }

            34 }

            35 }

            36 file.delete();

            37 }

            38

            39 public static void fileWrite(String str, String fileNamePath) throws IOException {

            40 FileWriter writer = null;

            41 try {

            42 File file = new File(fileNamePath);

            43 if (!file.getParentFile().existsJava 上传解压zip文件,而且解析文件里边的excel和图片()) {

            44 file.getParentFile().mkdirs();

            45 file.createNewFile();

            46 }

            47 writer = new FileWriter(file, true);

            48 writer.write(str + System.getProperty("line.separator"));

            49

            50 } catch (IOException e) {

            51 LogUtils.error(e.getMessage());

            52 } finally {

            53 if (writer != null) {

            54 writer.close();

            55 }

            56 }

            57 }

            58

            59 public static void changePermission(File dirFile, int mode) throws IOException {

            60 char[] modes = Integer.toOctalString(mode).toCharArray();

            61 if (modes.length != 3) {

            62 return;

            63 }

            64 Set perms = new HashSet();

            65 switch (modes[0]) {

            66 case '1':

            67 perms.add(PosixFilePermission.OWNER_EXECUTE);

            68 break;

            69 case '2':

            70 perms.add(PosixFilePermission.OWNER_WRITE);

            71 break;

            72 case '4':

            73 perms.add(PosixFilePermission.OWNER_READ);

            74 break;

            75 case '5':

            76 perms.add(PosixFilePermission.OWNER_READ);

            77 perms.add(PosixFilePermission.OWNER_EXECUTE);

            78 break;

            79 case '6':

            80 perms.add(PosixFilePermission.OWNER_READ);

            81 perms.add(PosixFilePermission.OWNER_WRITE);

            82 break;

            83 case '7':

            84 perms.add(PosixFilePermission.OWNER_READ);

            85 perms.add(PosixFilePermission.OWNER_WRITE);

            86 perms.add(PosixFilePermission.OWNER_EXECUTE);

            87 break;

            88

            89 default:

            90 break;

            91 }

            92 switch (modes[1]) {

            93 case '1':

            94 perms.add(PosixFilePermission.GROUP_EXECUTE);

            95 break;

            96 case '2':

            97 perms.add(PosixFilePermission.GROUP_WRITE);

            98 break;

            99 case '4':

            100 perms.add(PosixFilePermission.GROUP_READ);

            101 break;

            102 case '5':

            103 perms.add(PosixFilePermission.GROUP_READ);

            104 perms.add(PosixFilePermission.GROUP_EXECUTE);

            105 break;

            106 case '6':

            107 perms.add(PosixFilePermission.GROUP_READ);

            108 perms.add(PosixFilePermission.GROUP_WRITE);

            109 break;

            110 case '7':

            111 perms.add(PosixFilePermission.GROUP_READ);

            112 perms.add(PosixFilePermission.GROUP_WRITE);

            113 perms.add(PosixFilePermission.GROUP_EXECUTE);

            114 break;

            115 default:

            116 break;

            117 }

            118 switch (modes[2]) {

            119 case '1':

            120 perms.add(PosixFilePermission.OTHERS_EXECUTE);

            121 break;

            122 case '2':

            123 perms.add(PosixFilePermission.OTHERS_WRITE);

            124 break;

            125 case '4':

            126 perms.add(PosixFilePermission.OTHERS_READ);

            127 break;

            128 case '5':

            129 perms.add(PosixFilePermission.OTHERS_EXECUTE);

            130 perms.add(PosixFilePermission.OTHERS_READ);

            131 break;

            132 case '6':

            133 perms.add(PosixFilePermission.OTHERS_READ);

            134 perms.add(PosixFilePermission.OTHERS_WRITE);

            135 break;

            136 case '7':

            137 perms.add(PosixFilePermission.OTHERS_EXECUTE);

            138 perms.add(PosixFilePermission.OTHERS_READ);

            139 perms.add(PosixFilePermission.OTHERS_WRITE);

            140 break;Java 上传解压zip文件,而且解析文件里边的excel和图片

            141 default:

            142 break;

            143 }

            144

            145 try {

            146 Path path = Paths.get(dirFile.getAbsolutePath());

            147 Files.setPosixFilePermissions(path, perms);

            148 } catch (Exception e) {

            149 e.printStackTrace();

            150 }

            151 }

            152

            153 public static File mkFile(String fileName) {

            154 File f = new File(fileName);

            155 try {

            156 if (f.exists()) {

            157 f.delete();

            158 }

            159 f.createNewFile();

            160 } catch (IOException e) {

            161 e.printStackTrace();

            162 }

            163 return f;

            164 }

            165

            166

            167 public static void copyDirAndFile(String oldPath, String newPath) throws IOException {

            168 if (!(new File(newPath)).exists()) {

            169 (new File(newPath)).mkdir();

            170 }

            171 File file = new File(oldPath);

            172 //file name list

            173 String[] filePaths = file.list();

            174 for (String filePath : filePaths) {

            175 String oldFullPath = oldPath + file.separator + filePath;

            176 String newFullPath = newPath + file.separator + filePath;

            177 File oldFile = new File(oldFullPath);

            178 File newFile = new File(newFullPath);

            179 if (oldFile.isDirectory()) {

            180 copyDirAndFile(oldFullPath, newFullPath);

            181 } else if (oldFile.isFile()) {

            182 copyFile(oldFile, newFile);

            183 }

            184 }

            185 }

            186

            187 public static void copyFile(File source, File dest) throws IOException {

            188 FileChannel inputChannel = null;

            189 FileChannel outputChannel = null;

            190 try {

            191 inputChannel = new FileInputStream(source).getChannel();

            192 outputChannel = new FileOutputStream(dest).getChannel();

            193 outputChannel.transferFrom(inputChannel, 0, inputChannel.size());

            194 } finally {

            195 inputChannel.close();

            196 outputChannel.close();

            197 }

            198 }

            199

            200 /**

            201 * @author panchaoyuan

            202 * @param srcFile Unzipped file

            203 * @param destDirPath Unzipped destination folder

            204 * @throws RuntimeException

            205 * @throws IOException

            206 */

            207 public static void unZip(MultipartFile srcFile, String destDirPath,String savePath) throws RuntimeException, IOException {

            208 long startTime = System.currentTimeMillis();

            209

            210 File file = null;

            211 InputStream ins = srcFile.getInputStream();

            212 file=new File(savePath+srcFile.getOriginalFilename());

            213 LogUtils.info("MultipartFile transform to File,MultipartFile name:"+srcFile.getOriginalFilename());

            214 inputStreamToFile(ins, file);

            215

            216 if (!file.exists()) {

            217 throw new RuntimeException(file.getPath() + ",file is not found");

            218 }

            219 ZipFile zipFile = null;

            220 try {

            221 zipFile = new ZipFile(file);

            222 Enumeration

            223 while (entries.hasMoreElements()) {

            224 ZipEntry entry = (ZipEntry) entries.nextElement();

            225 LogUtils.info("zipFile context name:"+entry.getName());

            226 if (entry.isDirectory()) {

            227 String dirPath = destDirPath + File.separator+ entry.getName();

            228 File dir = new File(dirPath);

            229 dir.mkdirs();

            230 }else {

            231 File targetFile = new File(destDirPath + File.separator + entry.getName());

            232 targetFile.setExecutable(true);

            233 if(!targetFile.getParentFile().exists()){

            234 targetFile.getParentFile().mkdirs();

            235 }

            236 targetFile.createNewFile();

            237 InputStream is = zipFile.getInputStream(entry);

            238 FileOutputStream fos = new FileOutputStream(targetFile);

            239 int len;

            240 byte[] buf = new byte[1024];

            241 while ((len = is.read(buf)) != -1) {

            242 fos.write(buf, 0, len);

            243 }

            244 fos.close();

            245 is.close();

            246 }

            247 }

            248 long endTime = System.currentTimeMillis();

            249 LogUtils.info("unZip time-->" + (endTime - startTime) + " ms");

            25Java 上传解压zip文件,而且解析文件里边的excel和图片0 }catch(Exception e) {

            251 throw new RuntimeException("unzip error from FileUtil", e);

            252 } finally {

            253 if(zipFile != null){

            254 try {

            255 zipFile.close();

            256 } catch (IOException e) {

            257 e.printStackTrace();

            258 }

            259 }

            260

            261 //MultipartFile change to file may create a temp file in the project root folder(delete the temp file)

            262 File del = new File(file.toURI());

            263 del.delete();

            264 }

            265 }

            266

            267 /**

            268 * MultipartFile changed to File

            269 * @author panchaoyuan

            270 * @return

            271 */

            272 private static void inputStreamToFile(InputStream ins, File file) {

            273 try {

            274 OutputStream os = new FileOutputStream(file);

            275 int bytesRead = 0;

            276 byte[] buffer = new byte[8192];

            277 while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {

            278 os.write(buffer, 0, bytesRead);

            279 }

            280 os.close();

            281 ins.close();

            282 LogUtils.info("MultipartFile transform to File completed!");

            283 }catch(Exception e) {

            284 e.printStackTrace();

            285 }

            286 }

            287

            288 /**

            289 * @author panchaoyuan

            290 */

            291 public List getSubFiles(String desFile,List fileList) {

            292 File file = new File(desFile);

            293 File[] files = file.listFiles();

            294 for (File fileIndex : files) {

            295 if (!fileIndex.exists()) {

            296 throw new NullPointerException("Cannot find " + fileIndex);

            297 } else if (fileIndex.isFile()) {

            298 fileList.add(fileIndex);

            299 } else {

            300 if (fileIndex.isDirectory()) {

            301 getSubFiles(fileIndex.getAbsolutePath(),fileList);

            302 }

            303 }

            304 }

            305 return fileList;

            306 }

            307

            308

            309 }

            View Code

            水平有限,或许写得不是很完好,我们copy这些代码的时分有或许由于引进包的不同,Java 上传解压zip文件,而且解析文件里边的excel和图片不必定走得成功,如有疑问,在谈论区联络自己,写得欠好的当地也欢迎纠正。

            精彩文章来历微信大众号 java微技能

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP