文件下载:从服务器上下载,自动给下载的PDF添加水印
程序员文章站
2022-06-28 12:58:34
文件下载:从服务器上下载,自动给下载的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
上一篇: 联想小新Pad Pro 12.6大更新:新增电脑副屏功能
下一篇: C#根据屏幕分辨率改变图片尺寸