PDF解决方案(1)--文件上传

时间:2022-12-14 08:53:24

相关专题链接

PDF解决方案(1)--文件上传

PDF解决方案(2)--文件转PDF

PDF解决方案(3)--PDF转SWF

PDF解决方案(4)--在线浏览

前言:最近参与了一个项目,客户要求把系统所有用户提交的所有电子文件(主要是word、Excel、图片等)都转化为PDF格式保存,并且要能支持在线查看、自动加签(添加图片印章、数字证书)等功能,因为之前也没有接触这方面的知识在项目开发过程中也是遇到了诸多困难,但庆幸的是通过自己研究、百度等方法得到了解决,最后的效果还算令人满意,趁现在项目比较空闲把整个实现方案做个介绍。

一、demo效果图

选择文件提交后,在后台先转成pdf文件,然后再转化为swf文件在前台展示! demo比较简陋,没做太多修饰,主要是为了说明问题,大家不要在意这些细节!demo中用到的部分软件在下面下载区有链接,下载解压放在C盘即可。

PDF解决方案(1)--文件上传

二、文件上传

1、前台部分

前台采用form表单、隐藏iframe实现无刷新上传:

js部分代码

<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
<script type="text/javascript"> //支持的文件上传类型
var accept_extend = ['jpg', 'doc', 'docx', 'xls', 'xlsx', 'pdf', 'bmp', 'jpeg', 'png', 'gif'];
var basePath = "<%=basePath%>"; /**
* 校验文件扩展名
* @param {Object} t_ext 文件扩展名
* @return {TypeName} 校验是否通过
*/
function checkFileExtendName(t_ext)
{
var flag = false;
if (t_ext != '')
{
var length = accept_extend.length;
for (var i = 0; i < length; i++)
{
if (t_ext == accept_extend[i]) flag = true;
}
}
return flag;
} /**
* 文件上传方法
*/
function upload()
{
//校验
var file = document.getElementById("file").value;
if(file == undefined || file == null || file == "" )
{
alert("请选择文件!");
return;
} var type = file.slice(file.lastIndexOf('.')+1);
if(!checkFileExtendName(type.toLowerCase()))
{
alert("文件类型不支持!");
return;
} //提交
var form = document.getElementById('upload_form');
form.submit(); //提交按钮控制
$('#uploadBtn').attr('disabled', 'disabled');
$('#loading').css('display', ''); //获取写入隐藏iframe的上传结果
$("#iframe").load(function ()
{
var contents = $(this).contents().get(0);
var data = $(contents).find('body').html();
data = window.eval('(' + data + ')');
if(data.rtncode == 2000)
{
//上传成功后提示并展示swf区域
alert(data.name + "上传成功!");
$("#iframe_pdf_view").width($('body').width() * 0.97).height($('body').height() * 0.85);
$("#iframe_pdf_view").attr("src", basePath + "fileview.jsp?path=" + data.path);
}
$('#uploadBtn').removeAttr('disabled');
$('#loading').css('display', 'none'); $("#iframe").off("load");
});
} </script>

html部分代码

此处需要注意:文件上传时form表单属性enctype="multipart/form-data"后台才能获取文件流,属性target="iframe"需指向隐藏iframe的name才能实现无刷新上传。

<div style="background-color:#BDD8F2;margin-left:40%;margin-top:20px;border-style:double;margin-right:35%">
<div style="margin-top:10px;margin-left:10px">
<!-- from的target需指向隐藏iframe的name -->
<form id="upload_form" action="commonServlet?type=upload" method="post"
enctype="multipart/form-data" target="iframe" >
<input id="file" type="file" name="file" />
<img id="loading" src="data:images/loading.gif" style="display:none">
<input id="uploadBtn" type="button" value="提交" onclick="upload()"/>
</form>
<iframe id="iframe" name="iframe" style="width:0px;height:0px"></iframe>
</div>
</div>
<iframe id="iframe_pdf_view" scrolling="auto" frameborder="0" marginheight="0" marginwidth="0"></iframe>

2、后台代码:

后台使用Apache的fileupload包和IO包来解析请求获取文件流:

       PrintWriter out = response.getWriter();

        // 创建文件处理工厂,它用于生成FileItem对象。
DiskFileItemFactory difactory = new DiskFileItemFactory(); // 设置缓存大小,如果上传文件超过缓存大小,将使用临时目录做为缓存。
difactory.setSizeThreshold(1024 * 1024 * 5);
String dir = this.getServletContext().getRealPath("/");//应用目录 // 设置处理工厂缓存的临时目录,此目录下的文件需要手动删除。
File filedir = new File(dir + "file/temp");
if (!filedir.exists())
{
filedir.mkdirs();
}
difactory.setRepository(filedir); // 设置文件实际保存的目录
File fudir = new File(dir + "file/upload");
if (!fudir.exists())
{
fudir.mkdirs();
} //创建request的解析器,它会将数据封装到FileItem对象中。
ServletFileUpload sfu = new ServletFileUpload(difactory);
sfu.setHeaderEncoding("GBK"); //解析保存在request中的数据并返回list集合
List<FileItem> list = null;
try
{
list = sfu.parseRequest(request); } catch (FileUploadException e)
{
e.printStackTrace();
out.print("{rtncode:2001,message:'" + e.getMessage() + "'}");
out.flush();
out.close();
return;
}
String filename = null;
InputStream in = null;
FileOutputStream fos = null;
if (list != null && list.size() > 0)// 遍历list集合,取出每一个输入项的FileItem对象,并分别获取数据
{
for (Iterator<FileItem> it = list.iterator(); it.hasNext();)
{
FileItem fi = (FileItem) it.next();
if (fi.isFormField())//判断是否为表单属性
{
continue;
} String originalName = fi.getName();//原始文件名
String extendName = originalName.substring(originalName
.lastIndexOf(".") + 1);//获取原始文件扩展名
filename = UUID.randomUUID().toString() + ".pdf";//新文件名 //获取上传文件流
in = fi.getInputStream();
String pdfPath = dir + "file/upload/" + filename;//生成的PDF路径
fos = new FileOutputStream(pdfPath);//创建文件输出流 //文件转PDF处理
if (Constans.FileExtName.DOC.equalsIgnoreCase(extendName)
|| Constans.FileExtName.DOCX
.equalsIgnoreCase(extendName)
|| Constans.FileExtName.XLS
.equalsIgnoreCase(extendName)
|| Constans.FileExtName.XLSX
.equalsIgnoreCase(extendName))
{
// 调用openoffice转换office文件为PDF并存放到指定目录
PDFUtil.converterOffiec2PDF(in, fos, extendName);
}
else if (Constans.FileExtName.PDF.equalsIgnoreCase(extendName))
{
// 上传pdf文件到指定目录
PDFUtil.uploadPDF(in, fos);
}
else
{
PDFUtil.converterImg2Pdf(in, fos);
}
fi.delete();// 文件删除前需要关闭流 //调用swftools转换PDF为swf文件
if(PDFUtil.convert2SWF(pdfPath))
{
out.print("{rtncode:2000,message:'success',name:'"
+ originalName.substring(0, originalName
.lastIndexOf(".")) + "',path:'"
+ filename.replaceAll(".pdf", ".swf") + "'}");
}
else
{
out.print("{rtncode:2001,message:'error'}");
}
out.flush();
out.close();
}
}
 

相关文件下载地址

PDF解决方案demo: http://pan.baidu.com/s/1i3mmwux

swftools、xpdf:http://pan.baidu.com/s/1dDu1Yoh(注:解压放在C盘根目录即可)

PDF解决方案(1)--文件上传的更多相关文章

  1. Word&comma;Excel&comma;pdf&comma;txt等文件上传并提取内容

    近期项目需求:1.要用到各种文件上传,下载. 2.并对文件进行搜索. 3.仅仅要文件里包括有搜索的内容,所有显示出来. 今天正好有时间整理一下,方便以后阅读,及对须要用到的朋友提供微薄之力.首先在实现 ...

  2. Struts2之文件上传下载

    本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 <!-- 引入struts标签 --> <%@tag ...

  3. springMVC 文件上传 HTTP Status 400 – Bad Request

    可能原因是:multipartResolver没有配置正确 请看解决方案: <!--文件上传 id必须为multipartResolver,不然报错HTTP Status 400 – Bad R ...

  4. java文件上传下载组件

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  5. 超过20g的文件&plus;上传

    demo下载地址:jsp-Eclipse,jsp-MyEclipse,PHP,ASP.NET 教程:ASP.NET,JSP,PHP 一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件 ...

  6. ASP&period;NET文件上传大小的限制解决方案

    我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.config中的httpRunti ...

  7. SharePoint 2010 ——自定义上传页面与多文件上传解决方案

    最近项目遇到一个很麻烦的问题,原以为很容易解决,结果搞了那么久,先开个头,再慢慢写 SharePoint 2010 ——自定义上传页面与多文件上传解决方案 1.创建Sharepoint空白项目,创建应 ...

  8. Ubuntu本地文件上传至HDFS文件系统出现的乱码问题及解决方案

    1.问题来源及原因 用shell命令上传到HDFS中之后出现中文乱码,在shell命令窗口查看如图: 在eclipse中的文件HDFS查看工具查看如图: 原因:上传至HDFS文件系统的文本文件(这里是 ...

  9. Atitit&&num;160&semi;&&num;160&semi;文件上传&&num;160&semi;&&num;160&semi;架构设计&&num;160&semi;实现机制&&num;160&semi;解决方案&&num;160&semi;&&num;160&semi;实践java&&num;160&semi;php&&num;160&semi;c&num;&period;net&&num;160&semi;js&&num;160&semi;javascript&&num;160&semi;&&num;160&semi;c&plus;&plus;&&num;160&semi;python

    Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python 1. 上传的几点要求2 1.1. 本地预览2 1.2 ...

随机推荐

  1. C&num;中的日期处理函数

    C#中的日期处理函数 //2013年4月24日 this.TextBox6.Text = System.DateTime.Now.ToString("D"); //2013-4-2 ...

  2. 路由 - ASP&period;NET MVC 4 系列

           软件开发人员常常对一些细小的细节问题倍加关注,由其在考虑源代码的质量和结构时更是如此.因此,当遇到大部分使用 ASP.NET 技术构建的站点,使用如下的 URL 地址时,可能会有些奇怪: ...

  3. Intellij IDEA常用快捷键——Mac版

    http://blog.csdn.net/longshen747/article/details/17204699 http://totohust.iteye.com/blog/1035550 设置自 ...

  4. 接口自动化 基于python&plus;Testlink&plus;Jenkins实现的接口自动化测试框架

    链接:http://blog.sina.com.cn/s/blog_13cc013b50102w94u.html

  5. Python之使用Pandas库实现MySQL数据库的读写

      本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写.首先我们需要了解点ORM方面的知识. ORM技术   对象关系映射技术,即ORM(Object-Relational ...

  6. jmeter5&period;0 while controller使用总结

    while controller 配合sql使用的方式 在while控制器条件中填空,这样当里面的请求断言失败后就会跳出循环 在while控制器条件中填LAST,当里面的请求断言失败后就会跳出循环,如 ...

  7. (转)Mysql LIMIT如何正确对其进行优化

    以下的文章主要是对Mysql LIMIT简单介绍,我们大家都知道LIMIT子句一般是用来限制SELECT语句返回的实际行数.LIMIT取1个或是2个数字参数,如果给定的是2个参数,第一个指定要返回的第 ...

  8. 【Pyhon】利用BurpSuite到SQLMap批量测试SQL注入

    前言 通过Python脚本把Burp的HTTP请求提取出来交给SQLMap批量测试,提升找大门户网站SQL注入点的效率. 导出Burp的请求包 配置到Burp的代理后浏览门户站点,Burp会将URL纪 ...

  9. django restframework 快速入门

    django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...

  10. 如何测试Linux 中的wait函数能不能等待子进程的子进程?

    #include <stdio.h> #include <stdlib.h> int main() { pid_t pid = fork(); switch(pid) { : ...