java文件上传、下载、在线阅览、转Base64,依靠Mogodb,FTP

目录

FTP

上传[MultipartFile]文件到FTP

文件base64到MogoDB中

 从MogoDB获得文件的Base64

FTP下载和在线预览文件

 MogoDB下载


FTP

上传[MultipartFile]文件到FTP

controller

/**
  * @return com.ylz.bjyf.common.vo.ResultVO
  * @method uploadFile
  * @params [multipartFile, fjlx]   fjlx(前台提供)
  * @date 2021/4/19 23:05
  * @description 上传文件--Mododb---本地表
  */
        @PostMapping(value = "/upload-File")
        public ResultVO uploadFile (MultipartFile file, String fjlx) throws Exception {
            //判断文件类型,从而入本地库和线上库
            if (fjlx.equals("04")) {      //身份证正面
                fjlx = "04";
                return cydkBPO.uploadFile(file, fjlx);
            } else if (fjlx.equals("05")) {   //身份证反面
                fjlx = "05";
                return cydkBPO.uploadFile(file, fjlx);
            } else if (fjlx.equals("06")) {   //户口本正面
                fjlx = "06";
                return cydkBPO.uploadFile(file, fjlx);
            } else {
                return new ResultVO("文件上传失败");
            }
        }


bpo

    public ResultVO uploadFile(MultipartFile file, String fjlx) throws Exception {
        //************************图片压缩*****拿到multipartFile转file******************
        //压缩方式1:  5.9MB-> 1.9MB
        // Thumbnails.of(fromPic).scale(1f).outputQuality(0.25f).toFile(toPic);
        //MultipartFile file转file
        System.out.println("图片原来大小" + file.getSize());
        double fileSize = file.getSize(); //拿到大小
        //两个最终的
        File fromPic = MultipartFileToFile.multipartFileToFile(file);
        File toPic = fromPic;//toPic就是最终上传的文件
        int n = 0;
        if (fileSize > 1048576 && fileSize <= 5242880)   //大于1MB 小于5MB
        {
            while (fileSize > 1048576) //如果文件大小大于1MB
            {
                System.out.println("1-5MB压缩" + (n++) + "次");
                Thumbnails.of(fromPic).scale(0.6f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
                FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
                MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
                System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
                toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
                fileSize = multipartFiletoPic.getSize();  //大小赋值
                fromPic = toPic; // 旧的给新的,为了循环使用
            }
        } else if (fileSize > 5242880 && fileSize <= 10485760)                //大于5MB  小于10MB
        {
            while (fileSize > 1048576) //如果文件大小大于1MB
            {
                System.out.println("5MB-10MB压缩" + (n++) + "次");
                Thumbnails.of(fromPic).scale(0.5f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
                FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
                MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
                System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
                toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
                fileSize = multipartFiletoPic.getSize();  //大小赋值
                fromPic = toPic; // 旧的给新的,为了循环使用
            }
        } else if (fileSize > 10485760 && fileSize <= 20971520) {   //大于10MB ,小于20MB
            while (fileSize > 1048576) //如果文件大小大于1MB
            {
                System.out.println("10MB-20MB压缩" + (n++) + "次");
                Thumbnails.of(fromPic).scale(0.4f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
                FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
                MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
                System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
                toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
                fileSize = multipartFiletoPic.getSize();  //大小赋值
                fromPic = toPic; // 旧的给新的,为了循环使用
            }
        } else if (fileSize > 20971520 && fileSize <= 41943040) {
            while (fileSize > 1048576) //如果文件大小大于1MB
            {
                System.out.println("20MB-40MB压缩" + (n++) + "次");
                Thumbnails.of(fromPic).scale(0.3f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
                FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
                MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
                System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
                toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
                fileSize = multipartFiletoPic.getSize();  //大小赋值
                fromPic = toPic; // 旧的给新的,为了循环使用
            }
        } else if (fileSize > 41943040) {  //大于40MB
            while (fileSize > 1048576) {
                System.out.println("40MB以上压缩" + (n++) + "次");
                Thumbnails.of(fromPic).scale(0.1f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
                FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
                MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
                System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
                toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
                fileSize = multipartFiletoPic.getSize();  //大小赋值
                fromPic = toPic; // 旧的给新的,为了循环使用
            }
        }

        //最终toPic是最终的File文件,转mutifile
        FileInputStream fileIS = new FileInputStream(toPic);
        MultipartFile Multi = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileIS);
        System.out.println("最终大小" + Multi.getSize());


        //************************图片压缩************************

        //存入MongoDB
        String fjid = MongoDBUtil.putObject("business", Multi);//返回一个附件ID
        String fileName = Multi.getOriginalFilename();
        String type = Multi.getOriginalFilename().substring(Multi.getOriginalFilename().lastIndexOf("."));
        String fname = fjid + type;

//        //上传到FTP上面---方法一 暂时不考虑
//        File dest=new File(new File("/u01/ggfw/4-xsxx/jar/ftp-data/cydk").getAbsolutePath()+"/"+fname);
//        multipartFile.transferTo(dest);

        try {//上传到FTP上面
            PictureInfo pictureInfo = new PictureInfo(fjid, fname, fileName, fjlx);
            toFtpSever(pictureInfo);
        } catch (Exception e) {
            return new ResultVO().addData("data", e);
        }
        return new ResultVO().addData("data", new PictureInfo(fjid, fname, fileName, fjlx));
    }
 //本地图片上传到 FTP
    @Override
    public ResultVO toFtpSever(PictureInfo pictureInfo) {
        ResultVO vo = new ResultVO();
        String url = FTPEnum.url.getLOCAlFTP();
        //拿到Base64,就是文件
        FSObject fjOne = MongoDBUtil.getObject("business", pictureInfo.getFjid());
        try {
            //图片上传到 FTP
            CydkUtils.writeToLocal(url, fjOne, pictureInfo.getSname());
            vo.setAppcode(ResultEnum.success.getCode());
            vo.setMsg("SUCCESS");
            vo.addData("returnMsg", "保存成功");
            vo.addData("code", ResultEnum.success.getCode());
            vo.addData("data", "");
        } catch (IOException e) {
            e.printStackTrace();
            vo.setAppcode(ResultEnum.fail.getCode());
            vo.setMsg("FAIL");
            vo.addData("returnMsg", "上传保存失败");
            vo.addData("code", ResultEnum.fail.getCode());
            vo.addData("data", "");
        }
        return vo;
    }

文件base64到MogoDB中

BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes1 = decoder.decodeBuffer(yzdySavRetDTO.getGzs());//.getGzs()就是base64
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes1);
String GZSMOGOID = MongoDBUtil.putObjectStream("business", yzdySaveDTO.getReportId() + ".pdf", byteArrayInputStream);
 public static String putObjectStream(String business, String wjmc, InputStream inputStream) throws BusinessException {
        /***
         * 文件流通过前台传过来的
         */
        InputStream fileInputstream;
        String fileType = "";
        try {
            if(StringUtils.isNotBlank(wjmc)) {
                String[] split = wjmc.split("\\.");
                List<String> list = Arrays.asList(split);  //此集合无法操作添加元素
                List<String> list1 = new ArrayList<String>(list); //此集合可操作元素
                fileType = list1.get(1);
            }
            fileInputstream = inputStream;
            String filename = wjmc;
            FSObject fs = new FSObject();
            /*** 文件类型 */
            fs.setContentType(fileType);
            /*** 文件流 */
            fs.setInputstream(fileInputstream);
            /*** 文件名称 */
            fs.setName(wjmc);
            /*** 文件keyid */
            fs.setKeyId(wjmc);
            /**** 文件大小 */
            fs.setSize(fileInputstream.available());
            fs = mongoUtil.fsManager.putObject(business, fs);
            return fs.getKeyId();
        } catch (IOException e) {
            LOGGER.error("存储文件错误", e.getMessage());
            throw new BusinessException("系统错误,存储文件错误" + e.getMessage());
        }
    }

 从MogoDB获得文件的Base64

    /**
     * 从MogoDB中拿到图片Base64
     */
    @PostMapping(value = "/getImageBase64")
    public ResultVO getImageBase64(String fzsfjid) throws IOException {
        System.out.println(fzsfjid);

        return commBPO.getImageBase64(fzsfjid);
    }


    //获得图片
    @Override
    public ResultVO getImageBase64 (String fjid) throws IOException {
        ResultVO vo = new ResultVO();
        try {
            FSObject fsObject = MongoDBUtil.getObject("business", fjid);
            byte[] bytes = IOUtils.toByteArray(fsObject.getInputstream());
            if(bytes.length>0) {
                String s = Base64.getEncoder().encodeToString(bytes);
                HashMap map=new HashMap();
                map.put("base64",s);
                vo.addData("data",map);
            }else {
                vo.setErrorMsg("图片获取失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
            vo.setErrorMsg(e.getMessage());
        }
        return vo;
    }

FTP下载和在线预览文件

   /**
     * @method downfile
     * @description 下载文件
     */
    @RequestMapping("downfile")
    public void downfile(String path, HttpServletResponse httpServletResponse) {
        try {
            WordUtils.downLoad(path, httpServletResponse, false);
        } catch (Exception e) {
            log.info(e.getMessage());
        }
    }

    /**
     * @method downfile
     * @description 在线阅览文件
     */
    @RequestMapping("download")
    public void download(String path, HttpServletResponse httpServletResponse) {
        try {
            WordUtils.downLoad(path, httpServletResponse, true);
        } catch (Exception e) {
            log.info(e.getMessage());
        }
    }
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;

/**
 * 文件在线产看下载
 */
public class WordUtils {
    public static void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
        System.out.println("filePath------------------" + filePath);
        File f = new File(filePath);
        if (!f.exists()) {
            response.sendError(404, "File not found!");
            return;
        }
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
        byte[] buf = new byte[20480];
        int len = 0;

        response.reset(); // 非常重要
        if (isOnLine) { // 在线打开方式
            URL u = new URL("file:///" + filePath);
            response.setContentType(u.openConnection().getContentType());
            response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
            //response.setHeader("X-Frame-Options", "SAMEORIGIN");
            // 文件名应该编码成UTF-8
        } else { // 纯下载方式
            response.setContentType("application/x-msdownload");
            response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
        }
        OutputStream out = response.getOutputStream();
        while ((len = br.read(buf)) > 0)
            out.write(buf, 0, len);
        out.flush();
        br.close();
        out.close();
        //f.delete();
    }
}

 MogoDB下载

/**
     * @return void
     * @method getFile
     * @params [qycxQydxxDTO, response]
     * @description 下载文件流
     */
    @GetMapping("getFile/{serialno}")
    public void getFile(@PathVariable String serialno, HttpServletResponse response) throws Exception {
        printUtilBPO.getObject(serialno,response);
    }
 /**
     * @return java.lang.String
     * @method getObject
     * @params [mongoId, response]
     * @description 从mongodb获取文件对象
     */
    @Override
    public void getObject(String mongoId, HttpServletResponse response) {
        InputStream inputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            FSObject fsObject = MongoDBUtil.getObject("business", mongoId);
            inputStream = fsObject.getInputstream();
            byte[] buffer = new byte[1024];
            response.reset();
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fsObject.getName(), "UTF-8"));
            response.setContentType("application/json");
            bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
            int byteread;
            while ((byteread = inputStream.read(buffer)) != -1)
                bufferedOutputStream.write(buffer, 0, byteread);
            inputStream.close();
            bufferedOutputStream.flush();
            bufferedOutputStream.close();
        } catch (Exception e) {
            log.error("下载文件流异常:", e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    log.error("下载文件-关闭输入流异常:", e);
                }
            }
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    log.error("下载文件-关闭返回流异常:", e);
                }
            }
        }
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值