/** 
 | 
 * Copyright (c) 2018 人人开源 All rights reserved. 
 | 
 * <p> 
 | 
 * https://www.renren.io 
 | 
 * <p> 
 | 
 * 版权所有,侵权必究! 
 | 
 */ 
 | 
  
 | 
package com.zt.modules.oss.cloud; 
 | 
  
 | 
  
 | 
import com.baomidou.mybatisplus.core.toolkit.IdWorker; 
 | 
import com.spire.xls.Workbook; 
 | 
import com.zt.common.exception.ErrorCode; 
 | 
import com.zt.common.exception.RenException; 
 | 
import com.zt.common.utils.CommonUtils; 
 | 
import com.zt.core.oss.encry.IOssEncryptService; 
 | 
import com.zt.modules.oss.enums.CloudChannel; 
 | 
import com.zt.modules.oss.model.QdSysOss; 
 | 
import com.zt.modules.oss.model.SysOss; 
 | 
import org.apache.commons.io.FileUtils; 
 | 
import org.springframework.http.HttpHeaders; 
 | 
import org.springframework.http.HttpStatus; 
 | 
import org.springframework.http.MediaType; 
 | 
import org.springframework.http.ResponseEntity; 
 | 
import org.springframework.util.FileCopyUtils; 
 | 
  
 | 
import javax.servlet.ServletOutputStream; 
 | 
import javax.servlet.http.HttpServletResponse; 
 | 
import java.io.*; 
 | 
import java.net.URLEncoder; 
 | 
import java.util.Date; 
 | 
  
 | 
/** 
 | 
 * 本地上传 
 | 
 * 
 | 
 * @author hehz 
 | 
 */ 
 | 
  
 | 
public class LocalStorageService extends AbstractStorageService { 
 | 
  
 | 
    private IOssEncryptService ossEncryptService; 
 | 
  
 | 
    public LocalStorageService(StorageConfig config, QdStorageConfig qdConfig, IOssEncryptService ossEncryptService) { 
 | 
        this.config = config; 
 | 
        this.qdConfig = qdConfig; 
 | 
        this.ossEncryptService = ossEncryptService; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public SysOss upload(byte[] data, String path) { 
 | 
        return upload(new ByteArrayInputStream(data), path); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public SysOss upload(InputStream inputStream, String path) { 
 | 
        File file = new File(config.getLocalPath() + File.separator + path); 
 | 
        try { 
 | 
            FileUtils.copyToFile(ossEncryptService.encrypt(inputStream), file); 
 | 
        } catch (IOException e) { 
 | 
            throw new RenException(ErrorCode.OSS_UPLOAD_FILE_ERROR.getCode(), e, ""); 
 | 
        } 
 | 
  
 | 
        SysOss oss = new SysOss(); 
 | 
        oss.setId(IdWorker.getId()); 
 | 
        oss.setPath(path); 
 | 
        oss.setUrl(config.getLocalDomain() + "/sys/oss/content"); 
 | 
        return oss; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public SysOss uploadSuffix(byte[] data, String suffix) { 
 | 
        return upload(data, getPath(config.getLocalPrefix(), suffix)); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public SysOss uploadSuffix(InputStream inputStream, String suffix) { 
 | 
        return upload(inputStream, getPath(config.getLocalPrefix(), suffix)); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void delete(SysOss oss) { 
 | 
        if (oss != null) { 
 | 
            File file = new File(config.getLocalPath() + File.separator + oss.getPath()); 
 | 
            if (file.exists()) { 
 | 
                File dir = file.getParentFile(); 
 | 
                try { 
 | 
                    if (dir.listFiles().length == 1) { 
 | 
                        FileUtils.forceDelete(dir); 
 | 
                    } else { 
 | 
                        FileUtils.forceDelete(file); 
 | 
                    } 
 | 
                } catch (IOException e) { 
 | 
                    throw new RenException("本地文件删除失败!"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void content(SysOss oss, HttpServletResponse response) throws Exception { 
 | 
        Date beginDate = new Date(); 
 | 
        Date lastDate = beginDate; 
 | 
        if (oss == null) { 
 | 
            throw new IOException("文件不存在!"); 
 | 
        } 
 | 
        if (CloudChannel.LOCAL.getValue().equals(oss.getChannel())) { // 本地 
 | 
            String filename = oss.getName(); 
 | 
            if (",gif,jpg,jpeg,png,bmp,".contains("," + oss.getType() + ",")) {// 浏览图片 
 | 
                response.setContentType("image/jpeg"); 
 | 
            } else { 
 | 
                response.setContentType("application/octet-stream"); 
 | 
//                response.setHeader("Content-disposition", 
 | 
//                        "attachment;filename=" + new String(filename.getBytes("ISO8859-1"), "UTF-8")); 
 | 
                response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); 
 | 
            } 
 | 
            File file = new File(config.getLocalPath() + File.separator + oss.getPath()); 
 | 
            System.out.println(config.getLocalPath()); 
 | 
            System.out.println(File.separator); 
 | 
            System.out.println(oss.getPath()); 
 | 
            // 创建文件输入流 
 | 
            Date nowDate = new Date(); 
 | 
            System.out.println("准备时间:" + CommonUtils.getDatePoor(nowDate, lastDate)); 
 | 
            lastDate = nowDate; 
 | 
  
 | 
            InputStream is = ossEncryptService.decrypt(file); 
 | 
  
 | 
            nowDate = new Date(); 
 | 
            System.out.println("解密时间:" + CommonUtils.getDatePoor(nowDate, lastDate)); 
 | 
            lastDate = nowDate; 
 | 
            // 响应输出流 
 | 
            ServletOutputStream out = response.getOutputStream(); 
 | 
            // 创建缓冲区 
 | 
            byte[] buffer = new byte[1024]; 
 | 
            int len = 0; 
 | 
            while ((len = is.read(buffer)) != -1) { 
 | 
                out.write(buffer, 0, len); 
 | 
            } 
 | 
            is.close(); 
 | 
            out.flush(); 
 | 
            out.close(); 
 | 
            nowDate = new Date(); 
 | 
            System.out.println("输出时间:" + CommonUtils.getDatePoor(nowDate, lastDate)); 
 | 
            System.out.println("总时间:" + CommonUtils.getDatePoor(nowDate, beginDate)); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public ResponseEntity<byte[]> content2(SysOss oss) throws Exception { 
 | 
        if (oss == null) { 
 | 
            throw new IOException("文件不存在!"); 
 | 
        } 
 | 
        if (CloudChannel.LOCAL.getValue().equals(oss.getChannel())) { // 本地 
 | 
            String filename = oss.getName(); 
 | 
            File file = new File(config.getLocalPath() + File.separator + oss.getPath()); 
 | 
            if (file.exists()) { 
 | 
                try (InputStream in = ossEncryptService.decrypt(file)) { 
 | 
                    // 从文件输入流中读取Word文档的二进制数据并存储在documentBytes数组中 
 | 
                    byte[] documentBytes = new byte[0]; 
 | 
                    // 创建HTTP头部,设置内容类型为二进制流,并指定文件名 
 | 
                    HttpHeaders headers = new HttpHeaders(); 
 | 
                    // 返回包含二进制数据流的HTTP响应,状态码为200 
 | 
                    if (filename.endsWith(".xls")) { 
 | 
                        // 如果是xls文件,将其转换为xlsx格式 
 | 
                        Workbook workbook = new Workbook(); 
 | 
                        workbook.loadFromStream(in); // 使用loadFromStream方法加载xls文件 
 | 
                        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
 | 
                        workbook.saveToStream(outputStream, com.spire.xls.FileFormat.Version2013); // 指定文件格式 
 | 
                        documentBytes = outputStream.toByteArray(); 
 | 
                        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
 | 
                    }  else if (filename.endsWith(".docx") || filename.endsWith(".xlsx")) { 
 | 
                        documentBytes = FileCopyUtils.copyToByteArray(in); 
 | 
                        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); 
 | 
                        headers.setContentDispositionFormData("attachment", filename); 
 | 
                    } else if (filename.endsWith(".pdf")) { 
 | 
                        documentBytes = FileCopyUtils.copyToByteArray(in); 
 | 
                        headers.setContentType(MediaType.APPLICATION_PDF); 
 | 
                    } else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg")) { 
 | 
                        documentBytes = FileCopyUtils.copyToByteArray(in); 
 | 
                        headers.setContentType(MediaType.IMAGE_JPEG); 
 | 
                    } else if (filename.endsWith(".png")) { 
 | 
                        documentBytes = FileCopyUtils.copyToByteArray(in); 
 | 
                        headers.setContentType(MediaType.IMAGE_PNG); 
 | 
                    } 
 | 
                    return new ResponseEntity<>(documentBytes, headers, HttpStatus.OK); 
 | 
                } 
 | 
            } else { 
 | 
                String errorMessage = "文件不存在"; 
 | 
                return new ResponseEntity<>(errorMessage.getBytes(), HttpStatus.NOT_FOUND); 
 | 
            } 
 | 
        } 
 | 
        String errorMessage = "文件不存在"; 
 | 
        return new ResponseEntity<>(errorMessage.getBytes(), HttpStatus.NOT_FOUND); 
 | 
    } 
 | 
  
 | 
    public void getCommFile(String fileFlag, HttpServletResponse response) throws Exception { 
 | 
        if (fileFlag == null) { 
 | 
            throw new IOException("图片不存在!"); 
 | 
        } 
 | 
        if ("logo".contains(fileFlag)) {// 浏览图片 
 | 
            response.setContentType("image/jpeg"); 
 | 
        } else { 
 | 
            response.setContentType("application/octet-stream"); 
 | 
//                response.setHeader("Content-disposition", 
 | 
//                        "attachment;filename=" + new String(filename.getBytes("ISO8859-1"), "UTF-8")); 
 | 
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileFlag, "UTF-8")); 
 | 
        } 
 | 
        String url = config.getLocalPath() + File.separator + "comm-file" + File.separator + fileFlag; 
 | 
        File file = new File(url); 
 | 
        System.out.println(url); 
 | 
        // 创建文件输入流 
 | 
        InputStream is = ossEncryptService.decrypt(file); 
 | 
        // 响应输出流 
 | 
        ServletOutputStream out = response.getOutputStream(); 
 | 
        // 创建缓冲区 
 | 
        byte[] buffer = new byte[1024]; 
 | 
        int len = 0; 
 | 
        while ((len = is.read(buffer)) != -1) { 
 | 
            out.write(buffer, 0, len); 
 | 
        } 
 | 
        out.flush(); 
 | 
        out.close(); 
 | 
  
 | 
    } 
 | 
  
 | 
    public void qdContent(QdSysOss qdSysOss, HttpServletResponse response) throws Exception { 
 | 
        if (qdSysOss == null) { 
 | 
            throw new IOException("文件不存在!"); 
 | 
        } 
 | 
        if (CloudChannel.LOCAL.getValue().equals(qdSysOss.getChannel())) { // 本地 
 | 
            String filename = qdSysOss.getName(); 
 | 
            if (",gif,jpg,jpeg,png,bmp,".contains("," + qdSysOss.getType() + ",")) {// 浏览图片 
 | 
                response.setContentType("image/jpeg"); 
 | 
            } else { 
 | 
                response.setContentType("application/octet-stream"); 
 | 
//                response.setHeader("Content-disposition", 
 | 
//                        "attachment;filename=" + new String(filename.getBytes("ISO8859-1"), "UTF-8")); 
 | 
                response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); 
 | 
            } 
 | 
            File file = new File(qdConfig.getQdLocalPath() + File.separator + qdSysOss.getPath()); 
 | 
            System.out.println("qd:" + qdConfig.getQdLocalPath()); 
 | 
            System.out.println("qd:" + File.separator); 
 | 
            System.out.println("qd:" + qdSysOss.getPath()); 
 | 
            // 创建文件输入流 
 | 
            InputStream is = ossEncryptService.decrypt(file); 
 | 
            // 响应输出流 
 | 
            ServletOutputStream out = response.getOutputStream(); 
 | 
            // 创建缓冲区 
 | 
            byte[] buffer = new byte[1024]; 
 | 
            int len = 0; 
 | 
            while ((len = is.read(buffer)) != -1) { 
 | 
                out.write(buffer, 0, len); 
 | 
            } 
 | 
            is.close(); 
 | 
            out.flush(); 
 | 
            out.close(); 
 | 
  
 | 
        } 
 | 
    } 
 | 
} 
 |