`
smiky
  • 浏览: 257694 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

手把手教你做基于web的文件扫描并上传

阅读更多

最近碰到的问题,客户端调用本地的扫描仪,将扫描的文件上传。

使用到的技术:applet,twain,HttpClient

当然也碰到很多问题,因为在这周之前我都不知道什么是applet

一.Applet操作本地资源

基于安全方面的原因,applet是不允许操作本地资源的。但是java提供了相应的为jar包签名的机制来提升applet的权限。相信很多人都碰到过这种对话框:

让用户来决定是否给applet提升权限,如果用户信任这个资源,applet将能操作本地资源。

 

1.为applet依赖的jar包签名

java提供了两个工具;

keytool用于生成存放key的库

jarsigner用于为jar进行签名

 

首先建立一个keystore(这是在当前路径上操作):

keytool -genkey -alias zengge -keystore zengge.keystore

keytool -genkey表示建库

-alias zengge是为要建立的key取一个别名

-keystore zengge.keystore是建立一个名字叫zengge.keystore的key库,key就存在里面.

如下图:



 这样一个keystore就建立好了,在当前目录下就多出了一个zengge.keystore的文件


 

有了keystore之后jarsigner就可以利用存放在keystore中的key来为jar签名



 这里有两个类,先打包

 


包里面的META-INFO里面只有一个文件,且内容为上图

 

接下来为jar包签名:

jarsigner -keystore zengge.keystore HelloWorld.jar zengge
zengge.keystore是keystore的路径/名字,这里是相对路径
HelloWorld.jar是要签名的jar包
zengge是存放在keystore中的密钥的别名


密码为建立keystore时的密码

 

再来看一下签过名的jar里面的情况有什么变化:


可以看到META-INFO里面现在是三个文件,.DSAG与.SF我想肯定是用来加解密用的,大家注意现在的MANIFEST.MF,

可以看出为每个类添加了一个SHA签名,用它来保证,这个jar里面的内容不会被其它人修改,用户可以相信这个jar。

 

2.将applet嵌入html

applet是通过浏览器来运行了,可能你会问,java的东西浏览器怎么能运行呢,难道客户端也要安装java?

实际上applet是通过嵌在浏览器中的jvm在运行,但是这个jvm是从那里来的呢?

对于IE,大家可以看一下,下图中的java如果选中,就表示会调用本地的jre来运行applet。


但是绝大部分情况下,客户端是不会安装java的啊,还有firefox下面没有类似的这种选项。那么要如何来解决这种问题呢?

早期的applet都是用applet标签来嵌入html的(当然现在也可以),例如:

<APPLET CODE = "HelloWorld" archive ="HelloWorld.jar" JAVA_CODEBASE = "." WIDTH = "320" HEIGHT = "240" NAME = "HelloWorld"></APPLET>

这里的CODE表示类名(类名后可以加上.class),archvie表示类所在的jar包,如果你有多个jar包,可以全加在archive里面,用,号分开(archive="a,jar,b.jar,c.jar",当然这些jar要签名的还得签名)。

如果用这种标签,在IE下,如果没选中用本地jre运行applet的话,是运行不了的,没安装插件的firefox也是不能运行的。

 

面对这种情况,升级版的标签出现了,java提供了一个工具名字叫HTMLconverter,通过它,能将html中的applet标签转换成标准的标签,如下

<object
    classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
    codebase = "http://java.sun.com/update/1.6.0/jinstall-6u14-windows-i586.cab#Version=6,0,0,8"
    WIDTH = "320" HEIGHT = "240" NAME = "HelloWorld" >
    <PARAM NAME = CODE VALUE = "HelloWorld" >
    <PARAM NAME = CODEBASE VALUE = "." >
    <PARAM NAME = ARCHIVE VALUE = "applet_test.jar" >
    <PARAM NAME = NAME VALUE = "HelloWorld" >
    <param name = "type" value = "application/x-java-applet;version=1.6">
    <param name = "scriptable" value = "false">
	
	//上面是针对IE
	//下面的embed是针对firefox
	
    <comment>
	<embed
            type = "application/x-java-applet;version=1.6" \
            CODE = "HelloWorld" \
            JAVA_CODEBASE = "." \
            ARCHIVE = "applet_test.jar" \
            NAME = "HelloWorld" \
            WIDTH = "320" \
            HEIGHT = "240"
	    scriptable = false
	    pluginspage = "http://java.sun.com/products/plugin/index.html#download">
	    <noembed> 
            </noembed>
	</embed>
    </comment>
</object>
<!--
<APPLET CODE = "HelloWorld" JAVA_CODEBASE = "." WIDTH = "320" HEIGHT = "240" NAME = "HelloWorld">
</APPLET>
-->
<!--"END_CONVERTED_APPLET"-->
 

其中Object部分是针对IE的,embed是针对firefox的.classid与codebase都是表示相应的plugin的下载地址,如果codebase的版本高于classid将下载codebase版本的plugin。这样不管本地有没有安装java,applet都能正常运行了。

 

现在,在applet里面己经能调用本地的资源了,那么如何驱动扫描仪呢?

 

二.applet调用TWain驱动本地扫描仪

TWain是一个标准,用于获取扫描仪等设备的信息,它有很多实现(基本都是收费的),这里选择的是一个开源twain产品,mmsc twain(官网 http://www.mms-computing.co.uk/例子很丰富)。

只要本地安装有扫描仪驱动,twain就能找到并运行且获取到扫描的数据。

它里面有个Scanner类,Scanner scanner = Scanner.getDevice()能获取到相应的设备。然后为scanner添加一个监听器,ScannerListener,它里面有个方法public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){},第二个参数即为扫描得到的数据,而且这个方法是在扫描述的状态发生变变就会解发。具体可以看一些mmsc里面的例子。

 

三.applet与服务器通信

得到了扫描的数据,得把它上传到服务器。我这里用的是HttpClient(需要的jar包commons-codec-1.4.jar,commons-httpclient-3.0.jar,commons-io-1.4.jar,commons-logging-1.0.2.jar)。在使用时最好对这几个jar包都签名(我没有测试这种方式,我是将这几个jar全给解压了,最后连同我的类一起打成了一个jar,最后签名),上传代码位于update方法内即可。

因为扫描仪有多种状态,所以要进行判断,那次才是拿到了扫描数据。

public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){

    if(type.equals(ScannerIOMetadata.ACQUIRED)){
      BufferedImage image=metadata.getImage();
      System.out.println("Have an image now!");
      HttpClient httpClient = new HttpClient();
      MultipartPostMethod mpm = new MultipartPostMethod("http://localhost:8086/ReiyenDMS/TestUploadServlet");
//      MultipartPostMethod mpm = new MultipartPostMethod("http://localhost:8086/applet_study/servlet/AppletServlet");
      File file = new File("c:/upload/abc"+index+".jpg");
      try{
        ImageIO.write(image, "jpg", file);
        index++;
       mpm.addParameter("aFile", "haha.pdf", file);
		httpClient.executeMethod(mpm);

      }catch(Exception e){
        e.printStackTrace();
      }
    }else if(type.equals(ScannerIOMetadata.NEGOTIATE)){
      ScannerDevice device=metadata.getDevice();
/*
      try{
        device.setResolution(100);
//        device.setRegionOfInterest(0.0,0.0,40.0,50.0);       // top-left corner 40x50 mm
        device.setRegionOfInterest(0,0,400,500);               // top-left corner 400x500 pixels
        device.setShowUserInterface(false);
        device.setShowProgressBar(false);
      }catch(Exception e){
        e.printStackTrace();
      }
*/
    }else if(type.equals(ScannerIOMetadata.STATECHANGE)){
      System.err.println(metadata.getStateStr());
    }else if(type.equals(ScannerIOMetadata.EXCEPTION)){
      metadata.getException().printStackTrace();
    }
  }
 

 

完工

中间碰到最多的问题就是,applet签名及applet布署,开始老以为applet根平时的类布署是一样的,后来发现就应该把它当成一个独立的应用来对等。

 

中间可能有错,有问题请在家指出,谢谢

 

效果图(点击中间的acquire就能扫描了):

 

 

 

有童鞋反映提供的twain站点不能用了,特加上一个twain的源码,详见符件twian.rar
  • 大小: 12.2 KB
  • 大小: 6.6 KB
  • 大小: 3.8 KB
  • 大小: 6.4 KB
  • 大小: 12.9 KB
  • 大小: 2.2 KB
  • 大小: 15.1 KB
  • 大小: 20.8 KB
  • 大小: 32.7 KB
分享到:
评论
31 楼 smiky 2015-11-27  
majie648495595 写道
楼主,你好,那个Twain.rar能发给我吗?你的链接下载下来的文件都是损坏的。。。我的qq:648495595邮箱 648495595@qq.com
呃,n年没用早不知道放那去了
30 楼 majie648495595 2015-11-17  
楼主,你好,那个Twain.rar能发给我吗?你的链接下载下来的文件都是损坏的。。。我的qq:648495595邮箱 648495595@qq.com
29 楼 i2534 2011-03-15  
其实现在的jre也才15M左右,我记得是.
我们现在做报表就是使用applet来设计和打印.
很多时候,客户什么都会让你装的,甚至他们压根就不问你装了什么...
28 楼 gyx376987739 2011-03-15  
楼主,你好,那个Twain.rar能发给我吗?你的链接下载下来的文件都是损坏的。。。我的qq:376987739  邮箱 bxhgyx@163.com
27 楼 extendsill 2011-03-13  
支持一下,希望多点这种文章
26 楼 IcyFenix 2010-11-05  
mark
25 楼 007slm 2010-09-21  
marked by 007slm
24 楼 onlysomeone 2010-09-20  
OA系统可能需要。
23 楼 shuiguozheng 2010-05-18  
晚上 有时间看看!
22 楼 redwave 2010-05-17  
不错,生成key,签名,applet调用扫描仪
收藏
21 楼 zj1211 2010-05-17  
强力地顶一把,支持楼主,支持Applet, 我们也用applet做开发, 使用感悟是:第一次打开Applet时慢一点, 之后就很快, 而且说实话, applet在功能上够强,用 js和flash实现不了的功能, 用APPLET很轻松。
20 楼 zzy8712 2010-05-17  
支持下,不错的。
19 楼 jiakechong 2010-05-17  
我好象也有类似的需求,看看有什么不一样,谢谢分享,
18 楼 smiky 2010-05-17  
hommy8 写道
Applet已经淡忘多时了,谢谢LZ让我学到新东西。
不过我心里有个疑问,LZ这样设计,是不是要求用户打开着页面,然后操作扫描仪,才能监听到?如果把页面关闭了,就不能监听扫描仪了,是吧?如果是这样,其实也是合理的。只是....

你觉得逻辑有问题吗?请把话说完嘛,目前我只能想到这一层了。
17 楼 aaronbamboo 2010-05-17  
支持一下,挺实用的东东。
16 楼 hommy8 2010-05-17  
Applet已经淡忘多时了,谢谢LZ让我学到新东西。
不过我心里有个疑问,LZ这样设计,是不是要求用户打开着页面,然后操作扫描仪,才能监听到?如果把页面关闭了,就不能监听扫描仪了,是吧?如果是这样,其实也是合理的。只是....
15 楼 JavaChaos 2010-05-17  
学习了,从来没搞过这一块呢。
14 楼 workfish 2010-05-17  
学习一下,是很少见的资源
13 楼 peanut_sei 2010-05-17  
Thank you very much.
12 楼 beowulf1985 2010-05-17  
bs也会有安全问题的,以前做某个上传功能时,就碰到不能批量获取本地资源的尴尬。

相关推荐

    手把手教你学DSP:基于TMS320F28335

    手把手教你学DSP:基于TMS320F28335 手把手教你学DSP:基于TMS320F28335 手把手教你学DSP:基于TMS320F28335 手把手教你学DSP:基于TMS320F28335 手把手教你学DSP:基于TMS320F28335 手把手教你学DSP:基于TMS320F...

    手把手教你学DSP—基于TMS320F28335.zip

    手把手教你学DSP—基于TMS320F28335zip,这是由南京研旭电气科技有限公司开发的一套基于TMS320F28335套件的DSP视频教学课程的学习资料,由于内容比较多,分成了三部分来进行上传,这是第三部分

    003《老HRD手把手教你做绩效考核》.pdf

    003《老HRD手把手教你做绩效考核》.pdf

    手把手教你DSP基于MS320F28335 [张卿杰 编著]

    《手把手教你DSP基于MS320F28335》是由张卿杰编著的一本关于数字信号处理(DSP)技术的书籍,主要针对TI公司的TMS320F28335微控制器进行深入讲解。这本书是嵌入式系统开发者的重要参考资料,特别是对那些希望掌握DSP...

    《手把手教你学DSP-基于TMS320X281x》配套资料

    《手把手教你学DSP——基于TMS320X281x》配套资料,学习单片机和嵌入式用的,包括FLASH烧写的插件和说明,HELLODSP调试助手安装包及说明,和TMS320F2812手册

    手把手教你学DSP基于TMS320F28335.zip

    《手把手教你学DSP基于TMS320F28335》是一部全面解析数字信号处理(DSP)技术,并以TI公司的TMS320F28335芯片为核心的教程。这本书籍旨在帮助读者从基础到深入地理解DSP理论,并通过具体的实践操作掌握TMS320F28335...

    手把手教你学DSP 基于TMS320X281X 顾卫钢.pdf

    手把手教你学DSP 基于TMS320X281X 顾卫钢,不用我多说,学DSP的人都知道

    手把手教你学DSP基于MS320F28335_高清带书签

    《手把手教你学DSP:基于TMS320X281x》以TMS320X281xDSP的开发为主线,采用生动的语言深入浅出地介绍与DSP开发相关的方方面面,包括DSP开发环境的搭建、新工程的建立、CCS3.3的使用、GEL文件与CMD文件的编写、硬件...

    手把手教你dsp28335,高清pdf

    手把手教你学DSP28335高清pdf文件,北京航空航天大学出版社

    手把手教你学DSP—基于TMS320F28335的应用开发及实战1-5章课件.zip

    《手把手教你学DSP—基于TMS320F28335的应用开发及实战》是一本深入浅出的教程,主要针对Texas Instruments(TI)的TMS320F28335数字信号处理器(DSP)进行讲解。这门课程涵盖的内容丰富,从基础到实践,为读者提供...

    手把手教你学DSP--基于TMS320C55x光盘 + 书(高清).7z

    手把手教你学DSP--基于TMS320C55x光盘 (包括源代码 电路图PDF,DXP) + 基于TMS320C55x.PDF。比较适合刚入门,是一本DSP入门的好书。

    手把手教你学28335

    手把手教你学28335PDF文档,看了这个确实和2812有了对比

    手把手教你学DSP—基于TMS320F28335的应用开发及实战配套程序.zip

    《手把手教你学DSP—基于TMS320F28335的应用开发及实战配套程序》这个压缩包文件,主要围绕着数字信号处理器(DSP)的应用开发展开,特别是针对Texas Instruments(TI)的TMS320F28335型号。TMS320F28335是一款高...

    手把手教你学dsp 基于tms320f28335

    本资源是张卿杰编著的《手把手教你学DSP:基于TMS320F28335》,2015年版,完整版。

    手把手教你学DSP 基于TMS320X281X 顾卫钢2011

    《手把手教你学DSP 基于TMS320X281X 顾卫钢2011》是一本深入浅出介绍数字信号处理(DSP)技术的专业书籍,作者顾卫钢以其丰富的经验和专业知识,为读者揭示了TMS320X281X系列DSP芯片的应用精髓。该书的PDF版提供了...

    手把手教你学DSP 基于TMS320X281X光盘资料

    《手把手教你学DSP:基于TMS320X281X》是一本深入浅出的数字信号处理(DSP)教程,由顾卫钢在2011年编写,结合了理论与实践,旨在帮助读者掌握TMS320X281X系列DSP芯片的应用。TMS320X281X是德州仪器(TI)公司推出的...

    手把手教你学DSP—基于TMS320F28335

    【标题】"手把手教你学DSP—基于TMS320F28335"是一套针对TMS320F28335 DSP芯片的教程,旨在引导初学者逐步掌握数字信号处理的基本原理和实践技能。该课程由南京研旭电气科技有限公司精心制作,共包括17个课时,确保...

    手把手教你学DSPPDF

    【标题】"手把手教你学DSPPDF"是一份针对数字信号处理(DSP)初学者的教程性PDF文档,旨在引领读者逐步掌握这一领域的基础知识。该文档可能包含了从理论概念到实际应用的全面讲解,适合那些希望踏入数字信号处理世界...

    教程手把手教你做问答系列答案.docx

    在本教程“手把手教你做问答系列”中,我们将深入探讨如何有效地进行问答系统的构建与优化。这个系列的目的是帮助初学者以及有一定经验的开发者掌握问答系统的核心技术和实践方法,从而能够创建出高质量的问答解决...

    手把手教你学dsp2812,手把手教你学dsp2812pdf下载,C,C++

    《手把手教你学DSP2812》是一本专为初学者设计的 DSP(Digital Signal Processor)学习指南,主要围绕TI公司的TMS320F2812 DSP芯片进行讲解。这本书以其全面且易懂的特性,为读者提供了一个深入理解数字信号处理及其...

Global site tag (gtag.js) - Google Analytics