欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

文件下载:从服务器上下载,自动给下载的PDF添加水印

程序员文章站 2022-03-07 21:40:56
文件下载:从服务器上下载,自动给下载的PDF添加水印(一)javaweb 项目,前端页面点击下载指定文件,后端执行过程。部分封装在FileUtils工具类的方法代码放在 文件下载:从服务器上下载,自动给下载的PDF添加水印(二)一、从服务器文件下载,自动添加水印/** * 文件下载:从服务器上下载,自动给下载的PDF添加水印 * * @param pathName 文件名 * @param response * @param request...

javaweb 项目,前端页面点击下载指定文件,后端执行过程。
给文件添加水印方法的代码,放在下一篇:《给指定的PDF添加水印(二)》

一、从服务器文件下载,自动添加水印

/**
     * 文件下载:从服务器上下载,自动给下载的PDF添加水印
     *
     * @param pathName 文件名
     * @param response
     * @param request
     */
    @RequestMapping("/getPrinting")
    public void getPrinting(String pathName, HttpServletResponse response, HttpServletRequest request) {
        try {
        	//isValidFilename():文件名称验证
            if (!FileUtils.isValidFilename(pathName)) {
                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", pathName));
            }
            //下载的文件名
            String realFileName = System.currentTimeMillis() + pathName.substring(pathName.indexOf("_") + 1);
            /**
             * 响应参数
             *  setFileDownloadHeader():下载文件名重新编码
             */
            response.setCharacterEncoding("utf-8");
            response.setContentType("multipart/form-data");
            response.setHeader("Content-Disposition","attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName));
            //资源路径
            String inputFile = AppConfig.getDownloadPath() + pathName;
            String outputFile = AppConfig.getDownloadPath() + realFileName;
            /**
             * 生成有水印的文件,放在原文件同目录:
             * waterMark(String inputFile,String outputFile,String "水印"):封装在FileUtils工具类的加水印方法
             * 	        inputFile:原PDF文件路径
             *          outputFile:生成带水印的PDF文件路径
             */
            FileUtils.waterMark(inputFile, outputFile, "今天是2020年10月24日!");
            /**
             * 将指定文件下载:outoutFile
             * writeBytes(String filePath, OutputStream os):输出指定文件的byte数组
             * 可以修改参数 outputFile 为 inputFile ,即下载没有水印的原文件
             */
            FileUtils.writeBytes(outputFile, response.getOutputStream());
            if (null != outputFile) {
                // 删除在服务器上生成的带水印的PDF
                FileUtils.deleteFile(outputFile);
            }
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }

二、代码中调用的封装方法

其中 getPrinting() 方法执行整个过程调用了waterMark() 方法,给服务器资源文件添加水印,writeBytes() 方法输出指定文件的byte数组,即从服务器下载到本地。

上述代码调用了如下方法:
isValidFilename():文件名称验证
setFileDownloadHeader():下载文件名重新编码
waterMark():给指定文件添加水印(代码放下一篇
writeBytes():输出指定文件
deleteFile():删除文件

1.文件名称验证方法代码如下:
/**
     * 文件名称验证
     * 
     * @param filename 文件名称
     * @return true 正常 false 非法
     */
    public static boolean isValidFilename(String filename)
    {
        return filename.matches(FILENAME_PATTERN);
    }
2. 下载文件名重新编码方法代码如下:
/**
     * 下载文件名重新编码
     * 
     * @param request 请求对象
     * @param fileName 文件名
     * @return 编码后的文件名
     */
    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
    {
        final String agent = request.getHeader("USER-AGENT");
        String filename = fileName;
        if (agent.contains("MSIE"))
        {
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        }
        else if (agent.contains("Firefox"))
        {
            // 火狐浏览器
            filename = new String(fileName.getBytes(), "ISO8859-1");
        }
        else if (agent.contains("Chrome"))
        {
            // google浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        else
        {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
3.输出指定文件方法代码如下:
/**
     * 输出指定文件的byte数组
     * 
     * @param filePath 文件路径
     * @param os 输出流
     * @return
     */
    public static void writeBytes(String filePath, OutputStream os) throws IOException
    {
        FileInputStream fis = null;
        try
        {
            File file = new File(filePath);
            if (!file.exists())
            {
                throw new FileNotFoundException(filePath);
            }
            fis = new FileInputStream(file);
            byte[] b = new byte[1024];
            int length;
            while ((length = fis.read(b)) > 0)
            {
                os.write(b, 0, length);
            }
        }
        catch (IOException e)
        {
            throw e;
        }
        finally
        {
            if (os != null)
            {
                try
                {
                    os.close();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
            }
            if (fis != null)
            {
                try
                {
                    fis.close();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
            }
        }
    }
4.删除文件方法代码如下:
/**
     * 删除文件
     * 
     * @param filePath 文件
     * @return
     */
    public static boolean deleteFile(String filePath)
    {
        boolean flag = false;
        File file = new File(filePath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists())
        {
            file.delete();
            flag = true;
        }
        return flag;
    }

本文地址:https://blog.csdn.net/tanghaixu/article/details/109259050