Java实现文件的上传下载

用这篇文章来介绍一种Java文件上传和下载的方法。可以将上传的文件保存到本地磁盘或者服务器,同时,可再从此路径将文件下载,前面不过多介绍了,一些解释都在代码注释里。

/**
     * 上传
     * @param file file
     * @param taskId taskId
     * @return String
     */
    public String fileUpload(MultipartFile file, String taskId) {

        Long checkTaskId = Long.parseLong(taskId);
        String originalFilename;
        if (file.isEmpty()) {
            return "文件不存在";
        } else {
            //获取文件名称,包含格式(fileName.pdf)
            originalFilename = file.getOriginalFilename();
            //如有必要将文件上传至数据库(我的业务中文件与某个操作关联
            //所以在插入之前应该判断数据库中是否已存在)
            //判断数据库中该操作下的该文件是否已存在(代码略)
            fileTaskDao.insertFileOfTask(originalFilename, checkTaskId);
            log.info("# originalFilename=[{}] , name=[{}] , size=[{}] , contentType=[{}] ", originalFilename, file.getName(), file.getSize(), file.getContentType());
            try {
                if(StringUtils.isNotEmpty(originalFilename)){
                    //创建文件夹,filePath是文件保存路径,我是写在配置文件里,用@Value注进来
                    File fileDir = new File(filePath);
                    if(!fileDir.exists()){
                        boolean mkdir = fileDir.mkdir();
                        if (!mkdir){
                            log.info("fileDir 文件夹创建失败");
                            return Result.fail(ResultType.FAIL.getCode(), "文件上传失败");
                        }
                    }
                    //用apache.commons.io.FileUtils类的方法copyInputStreamToFile
                    //拷贝一个字节流到一个文件中,如果这个文件不存在则创建,存在将被重写进内容
                    FileUtils.copyInputStreamToFile(file.getInputStream(), new File(fileRealPath, originalFilename));
                }
            } catch (IOException e) {
                e.printStackTrace();
                return Result.fail(ResultType.FAIL.getCode(), "文件上传失败");
            }
        }
        return Result.success(ResultType.SUCCESS.getCode(), "文件上传成功");
    }
/**
     * 下载
     * @param checkTaskId checkTaskId
     * @param fileName fileName
     * @return ResponseEntity<byte[]>
     */
    public ResponseEntity<byte[]> downloadFile(String fileName, String checkTaskId) throws IOException {

        //文件下载路径,这个路径在上面说了,注意要加文件名
        String Path = filePath + fileName;
        log.info("# download Path=[{}]", Path);
        File file = new File(Path);
        HttpHeaders headers = new HttpHeaders();
        //application/octet-stream属于HTTP规范中Content-Type的一种,其只能提交二进制
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", new String(file.getName().getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
        //readFileToByteArray 把一个文件转换成字节数组返回
        return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
        //页面直接弹出下载框,就结束咯
    }

如果遇到上传文件过大报错的问题,请看 解决文件上传时文件过大问题

点关注 不迷路,一起解决更多问题,微信公众号:非定义式程序员

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值