【Java 封装的文件上传和下载方法】

Java 封装的文件上传和下载方法

前言

最近练习springcloud下作crud和文件操作,IO流的基础知识真是很重要,结合网上的写法,封装了文件上传下载的方法,便于以后使用,但是由于传参不一定相同,可能实用性并不高,但是可以作为参考。

文件上传

/**
     *
     * @param targetPath  文件上传的目标路径
     * @param file        上传的文件,类型为 MultipartFile
     * @return filePathAndName   上传文件的路径名/文件名
     */
    public static String uploadFileUtil(String targetPath, MultipartFile file) {
        String filePathAndName = "";
        String originalFilename = file.getOriginalFilename();
        //截取文件的原始名字,保留 “.后缀名” 。作为保存文件的子文件夹 便于分类
        String subName = originalFilename.substring(originalFilename.lastIndexOf("."));
        String newPath = targetPath + File.separator + subName;
        try {
            File newFilePath = new File(newPath);//获取路径的File对象
            if (!newFilePath.exists()) {
                newFilePath.mkdirs();
            }
            //拼接文件的: 绝对路径名 + "\" + 文件原始名
            filePathAndName = newPath + File.separator + originalFilename;
            File file1 = new File(filePathAndName);//创建File对象
            file.transferTo(file1);//用新创建的对象调用传输方法,就完成了上传功能
            log.info("上传成功");
        } catch (Exception e) {
            log.error("上传失败", e);
        }
        return filePathAndName;
    }

我这里返回的是文件的URL地址,就是在磁盘保存位置的路径名\文件名,因为还有一个场景是在线查看,文件放在nginx的html文件夹下,就可以用 localhost/ 去在线访问了。

文件下载

/**
     *
     * @param request HttpServletRequest
     * @param response HttpServletResponse
     * @param fileURL  fileURL 是文件的路径名+文件名
     */
    public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String fileURL) {
        //在数据库中查出文件的带路径的全名
        //获取要下载的文件
        File file = new File(fileURL);
        InputStream inputStream = null;
        OutputStream outputStream = null;
        byte[] bytes = new byte[1024];
        int len = 0;

        try {
            inputStream = new FileInputStream(file);
            outputStream = response.getOutputStream();

            response.setContentType("application/force-download");
            String fileName = file.getName();

            //设置响应头
            response.reset();
            response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
            response.setContentLength((int)file.length());
            //循环将输入流读取到缓冲区
            while ((len = inputStream.read(bytes)) != -1) {
                //读取到的数据写入到输出流
                outputStream.write(bytes, 0, len);

            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.flush();
                inputStream.close();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

文件下载这里,当我们在前端点击某个文件时,点击的请求中包含了很多信息,可以在这个请求的信息中获取当前点击的文件的id等信息,然后实现的时候,通过id查询保存在数据库中的文件URL地址,传入这个方法中,就可以完成下载了。

存在的问题

在上传的方法中,实测上传的文件名不能为中文,中文的文字经过 getoriginName 方法后,获取的名字为:???.xxx ,(xxx为文件后缀名),
网上看了很多解决办法,也没有解决,但是如果在程序里将这个名字重命名,中文也不会乱码。。。只能以后在慢慢看了。

你可能感兴趣的:(java,开发语言)