java--文件上传与压缩下载(使用java 1.8 ZipOutputStream)

1.使用java 1.8 ZipOutputStream 下载压缩文件

    /**
     * 批量文件压缩后下载
     * import org.apache.tools.zip.ZipEntry;
     * import org.apache.tools.zip.ZipOutputStream;
     */
    @RequestMapping("/wmg-ml!fileDownload.do")
    public ResponseEntity fileDownload(HttpServletRequest request) throws IOException {
        ResponseEntity responseEntity = null;

        //1.服务器端输出压缩文件
        //获取登录用户信息
        OpuOmUser currentUser = SecurityContext.getCurrentUser();
        String userLoginName =  currentUser.getUserName();
        Date now = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmsssss");
        String dateFormat = sdf.format(now);
        String resourcesName ="/[反馈附件]"+dateFormat+"_"+userLoginName+".zip";//服务器段压缩后的文件名 采用:“[反馈附件]-”+当前时间戳+"_"+处理人 的形式
        String zipFileName = STORAGE_URL+feedbackFilePath+resourcesName;//压缩文件的完整路径名
        FileOutputStream fileOut = new FileOutputStream(zipFileName)
        ZipOutputStream zipOut = new ZipOutputStream(fileOut );//生成并输出压缩文件
        InputStream input = null;
        //2.将服务器需要压缩的文件添加到服务器端的压缩文件中
        String csId = request.getParameter("csId");
        String fId = request.getParameter("fId");
        List sysFileList = getFileUrl(csId,fId);//需要压缩的文件
        if(null != sysFileList && sysFileList.size() >0){
            int listSize = sysFileList.size();
            for(int i = 0; i < listSize; i++){
                String filename = sysFileList.get(i).get("FILE_NAME").toString();
                String filePath = sysFileList.get(i).get("FILE_PATH").toString();
                String name = STORAGE_URL + filePath+"/"+filename;//文件的完整路径名
                input = new FileInputStream(new File(name));//转换为文件流
                zipOut.putNextEntry(new ZipEntry(filename));//将文件添加至压缩包
                // 写入当前条目所对应的具体内容
                byte[] buff = new byte[1024];
                int len = 0;
                while ((len = input.read(buff)) != -1) {
                    zipOut.write(buff, 0, len);
                }
                input.close();//关闭流
            }
            fileOut.close();//关闭流
            zipOut.close();//关闭流
            //3.前端下载 服务器的压缩文件
            File file = new File(zipFileName);//读取压缩文件
            HttpHeaders headers = new HttpHeaders();
            String filename = new String(resourcesName.getBytes("utf-8"),"iso-8859-1");
            headers.setContentDispositionFormData("attachment", filename);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            responseEntity = new ResponseEntity(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
            //4.删除服务器端的压缩文件
            file.delete();//删除压缩包
        }

        return responseEntity;

    }

2.文件上传

 /**
     * 将附件上传至服务器磁盘的指定路径下
     *
     * @param filePath           附件上传的服务器磁盘路径
     * @param fileName           文件名
     * @param multipartFile         页面上传的附件对象
     * @param isAbsoluteFilePath 是否为绝对路径。true表示为filePath为服务器的绝对路径,false表示为当前应用下的相对路径
     * @param autoBuildDir       true表示当文件路径不存在时自动创建
     * @param canCover           true表示当指定文件已经存在时可覆盖原有文件
     * @return true表示上传成功,false表示上传失败
     */
    @Override
    public boolean uploadFile(String filePath,
                              String fileName,
                              MultipartFile multipartFile,
                              boolean isAbsoluteFilePath,
                              boolean autoBuildDir,
                              boolean canCover) {
        boolean result = false;

        if (multipartFile == null || multipartFile.isEmpty()
                || multipartFile.getSize() == 0 || filePath == null || filePath.trim().length() == 0) {
            return result;
        }

        InputStream in = null;
        OutputStream out = null;

        try {
            // 文件路径格式处理
            filePath = filePath.replace("\\", "/");

            // 上传附件文件夹路径,如果是绝对路径则使用绝对路径,如果不是则使用默认路径
            String directoryPath = isAbsoluteFilePath ? filePath : STORAGE_URL + filePath;

            // 完整上传路径
            String wholeFilePath = directoryPath + "/" + fileName;

            // 如果文件目录不存在则创建
            if (autoBuildDir) {
                File dir = new File(directoryPath);
                if (!dir.exists())
                    dir.mkdirs();
            }

            // 输出附件
            File outputFile = new File(wholeFilePath);

            //如果文件不存在则可上传,如果文件存在并且设置为可覆盖则也可上传
            boolean isFileExist = outputFile.exists();
            if (!isFileExist || (isFileExist && canCover)) {

                boolean canUpload = true; //标识是否能够上传文件

                //如果文件存在要先删除,如果文件不存在则标识为可上传
                if (isFileExist)
                    canUpload = outputFile.delete();

                if (canUpload) {

                    // 保存附件至服务器

                    int available = 0;
                    in = new BufferedInputStream(multipartFile.getInputStream(), BUFFER_SIZE);
                    out = new BufferedOutputStream(new FileOutputStream(outputFile), BUFFER_SIZE);
                    byte[] buffer = new byte[BUFFER_SIZE];
                    while ((available = in.read(buffer)) > 0) {
                        if (available < BUFFER_SIZE)
                            out.write(buffer, 0, available);
                        else
                            out.write(buffer, 0, BUFFER_SIZE);
                    }

                    result = true;//上传附件成功
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return result;
    }

你可能感兴趣的:(后端,java)