上传文件、下载文集及预览文件

上传文件

 	/**
     * 上传文件
     *
     * @param files
     * @return 文件地址
     * @throws Exception
     */
    @PostMapping(value = "upload", name = "上传文件")
    public Result uploadImport(@Validated({ICRUDController.ISaveGroup.class}) FileUploadVo fileUploadVo, MultipartFile[] files) {
        // 检查上传目录
        File directory = new File(uploadFileLocation);
        if (!directory.exists()) {
            if (!directory.mkdirs()) {
                throw new RFException(StatusCodeEnum.FAILED_CREATE_DIR, ObjectCode.UPLOADDIR);
            }
        }
        // 对要保存的文件名进行处理
        String[] spFileNames = new String[]{};
        if (StringUtils.hasText(fileUploadVo.getFileNames())) {
            spFileNames = fileUploadVo.getFileNames().split(",");
        }

        List<FileInfo> fileInfoList = new ArrayList<>();
        int index = 0;

        for (MultipartFile file : files) {
            String filename = StrUtils.shortUUID();
            File localFile = new File(uploadFileLocation, filename);
            try {
                file.transferTo(localFile);
                log.info(localFile.getPath());
            } catch (IOException e) {
                e.printStackTrace();
            }

            FileInfo fileInfo = new FileInfo();
            fileInfo.setPk(StrUtils.shortUUID()).setProjPk(fileUploadVo.getProjectPk()).setNodePk(fileUploadVo.getNodePk()).setFileSuffix("." + FilenameUtils.getExtension(file.getOriginalFilename())).setFileUrl(filename).setCreateDate(new Date()).setUploaderPk(obtainLoginerInfo().getUserId()).setEffectStatus(IPublicStatus.EffectStatus.ENABLED.value()).setRecordStatus(IPublicStatus.RecordStatus.CREATED.value());
            if (index < spFileNames.length) {
                fileInfo.setFileName(spFileNames[index]);
            } else {
                fileInfo.setFileName(FilenameUtils.getBaseName(file.getOriginalFilename()));
            }
            // 根据文件名后缀判断文件类型
            try {
                if (null != ImageIO.read(localFile)) {
                    fileInfo.setFileType(FileInfo.FileType.IMAGEFILE.value());
                } else {
                    fileInfo.setFileType(FileInfo.FileType.DOCFILE.value());
                }
            } catch (IOException ex) {
                fileInfo.setFileType(FileInfo.FileType.DOCFILE.value());
            }
            fileInfoList.add(fileInfo);
            index++;
        }
        // 保存文件信息
        int[] count = Db.batchSave(fileInfoList, fileInfoList.size());
        Boolean flag = count.length > 0 ? true : false;
        return Result.builder().success(true).data(flag).build();
    }

下载文件

	/**
     * 浏览器下载文件
     * @param model
     */
    @GetMapping(value = "download", name = "下载文件")
    public void download(@Validated({ICRUDController.IDownloadAndPreView.class}) FileInfoVo model) {
        FileInfo fileInfo = FileInfo.dao.findById(model.getFilePk());
        if (null == fileInfo) {
            throw new RFException(StatusCodeEnum.EXCEPTION_OBJECT_NOTEXIST, ObjectCode.FILE);
        }
        try {
            //下载文件的路径
            String path = uploadFileLocation + File.separator + fileInfo.getFileUrl();
            File file = new File(path);
            if(file.exists()){
                String filename = fileInfo.getFileName() + fileInfo.getFileSuffix();
                //将文件写入输入流
                FileInputStream fileInputStream = new FileInputStream(file);
                InputStream fis = new BufferedInputStream(fileInputStream);
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                fis.close();

                // 清空response
                response.reset();
                // 设置response的Header
                response.setCharacterEncoding("UTF-8");
                //Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存
                //attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"
                // filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
                // 告知浏览器文件的大小
                response.addHeader("Content-Length", "" + file.length());
                OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
                response.setContentType("application/octet-stream");
                outputStream.write(buffer);
                outputStream.flush();
            }else{
                //如果文件未找到则返回状态码404
                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

预览文件视图

	/**
     * 预览文件视图
     * @param model
     */
    @GetMapping(value = "preview", name = "预览文件")
    public void preView(@Validated({ICRUDController.IDownloadAndPreView.class}) FileInfoVo model){
        FileInfo fileInfo = FileInfo.dao.findById(model.getFilePk());
        if (null == fileInfo) {
            throw new RFException(StatusCodeEnum.EXCEPTION_OBJECT_NOTEXIST, ObjectCode.FILE);
        }
        try {
            //预览文件的路径
            String path = uploadFileLocation + File.separator + fileInfo.getFileUrl();
            File file = new File(path);
            FileInputStream fis = new FileInputStream(file);
            //将文件写入输出流
            ServletOutputStream os = response.getOutputStream();
            byte [] b = new byte[1024*8];
            while(fis.read(b)!=-1){
                os.write(b);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
posted @ 2022-10-26 17:39  晴天阴天下雨天  阅读(44)  评论(0)    收藏  举报