文件服务器的上传下载接口

在我们日常开发中,文件服务器是经常用的。本文将介绍如何实现上传下载接口。

1.上传

这里有一个实体 用于存放文件信息,存放路径commonfile在配置文件中配置。

@RestController
public class FileUpload {

    @Value("${commonfile}")
    private String commonfile;

    /**
     * 使用Spring MVC的multipartFile 类作为参数
     *
     * @param multipartFile
     * @return
     */
    @PostMapping("/upload")
    @ResponseBody
    @ArchivesLog(operationName = "上传")
    public Result<FileMessage> uploadMultipartFile(@RequestParam("file") MultipartFile multipartFile) {
        Result<FileMessage> result = new Result<FileMessage>();
        FileMessage fileMessageVO = new FileMessage();
        String fileName = multipartFile.getOriginalFilename();
        try {
            // 获取文件字节数组
            byte[] bytes = multipartFile.getBytes();
            // 文件存储路径(/fileupload1/ 这样会在根目录下创建问价夹)
            File pfile = new File(commonfile);
            // 判断文件夹是否存在
            if (!pfile.exists()) {
                // 不存在时,创建文件夹
                pfile.mkdirs();
            }
            // 创建文件
            File file = new File(pfile, fileName);
            // 写入指定文件夹
            OutputStream out = new FileOutputStream(file);
            out.write(bytes);
            // 组装对象
            fileMessageVO.setFileName(fileName);
            fileMessageVO.setFileRoute(commonfile);
            fileMessageVO.setFileDownloadUri(commonfile + fileName);
            fileMessageVO.setSize(getPrintSize(file.length()));
            fileMessageVO.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
            result.setData(fileMessageVO);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String getPrintSize(long size) {
        // 如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义
        if (size < 1024) {
            return String.valueOf(size) + "B";
        } else {
            size = size / 1024;
        }
        // 如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位
        // 因为还没有到达要使用另一个单位的时候
        // 接下去以此类推
        if (size < 1024) {
            return String.valueOf(size) + "KB";
        } else {
            size = size / 1024;
        }
        if (size < 1024) {
            // 因为如果以MB为单位的话,要保留最后1位小数,
            // 因此,把此数乘以100之后再取余
            size = size * 100;
            return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB";
        } else {
            // 否则如果要以GB为单位的,先除于1024再作同样的处理
            size = size * 100 / 1024;
            return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "GB";
        }
    }

}

实体类

public class FileMessage {

    /**
     * 文件名称
     */
    private String fileName;

    /**
     * 文件路径
     */
    private String fileRoute;

    /**
     * 下载地址
     */
    private String fileDownloadUri;

    /**
     * 文件类型
     */
    private String fileType;

    /**
     * 文件大小
     */
    private String size;
}

2.下载

@RestController
public class FileDownload {

    @Value("${commonfile}")
    private String commonfile;

    @GetMapping("/download")
    public String downloadFile(FileMessage fileMessage) throws UnsupportedEncodingException {
        // 获取HttpServletResponse
        HttpServletResponse response =
            ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
        String fileName = fileMessage.getFileName();// 文件名
        if (fileName != null) {
            // 设置文件路径
            File file = new File(commonfile + fileName);
            if (file.exists()) {
                RequestAttributes requsetAttributes = RequestContextHolder.currentRequestAttributes();
                HttpServletRequest request = ((ServletRequestAttributes)requsetAttributes).getRequest();
                // 获得浏览器代理信息
                final String userAgent = request.getHeader("USER-AGENT");
                // 判断浏览器代理并分别设置响应给浏览器的编码格式
                if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
                    // IE浏览器
                    fileName = URLEncoder.encode(fileName, "UTF-8");
                } else if (StringUtils.contains(userAgent, "Mozilla")) {
                    // google,火狐浏览器
                    fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
                } else {
                    // 其他浏览器
                    fileName = URLEncoder.encode(fileName, "UTF-8");// 其他浏览器
                }
                // 设置HTTP响应头
                response.reset();
                // 重置 如果不在页面上显示而是下载下来 则放开注释
                // response.setContentType("application/octet-stream");// 告知浏览器下载文件,而不是直接打开,浏览器默认为打开
                // response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");// 下载文件的名称
 
                try {
                    
                    OutputStream os = response.getOutputStream();
                    // 读取文件
                    InputStream in = new FileInputStream(file);
                    // copy文件
                    IOUtils.copy(in, os);
                    in.close();
                    os.close();
                    return "下载成功";
                } catch (Exception e) {
                    e.printStackTrace();
                } 
            }
        }
        return "下载失败";
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鲍侃java

请博主喝个可乐吧,可加微信面基

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值