之前操作是这样的:
1.项目有一个二代身份证的扫描器,扫描过身份证后,照片会生成在一个指定的目录。
2.用户于去目录下找到这些照片,通过input type=file 上传。
3.用户点确定提交请求。打算改造成这样的:
1.扫描过身份证后,照片生成在指定的目录;
2.在页面上点确定后就能直接上传到服务器(不需要中间的选择照片步骤)。这样的目的是为了减少用户选择照片中间操作请教各位大大,如何实现这样的功能

解决方案 »

  1.   

    如果是B/S的话,我觉得这个需求.....不太合理,写插件吧.
    如果一般的技术都能实现的话,那B/S去偷别人的东西也太简单了.
      

  2.   

    就是一个文件IO,然后组装http协议发送就可以了,这个对于ocx和applet应该是很简单的事情。
      

  3.   

    嗯,我也想写个applet,但是不知如何下手
      

  4.   

     
    /**
     *Description: encapsule http protocol of uploading.
     *@param url  The server url of handleing upload.
     *@param sessionId  Session id
     *@param uploadFile The file that is going to be uploaded
     *@param param Other form parameters
     *@return
     *@throws
     */
    public static void doMultipartUpload( String url,  String sessionId, 
          File uploadFile,  Map<String, String> param, 
          UploadApplet applet,  List<Map<String, String>> fileList,
          int index) {
           
         long blockSize = 5*MB;
            int rate = 0;
            long fileSize = uploadFile.length();
           
            long uploadCount = ((long)(fileSize - 1)/blockSize) + 1;
            System.out.println("before loop ..................."+fileSize+"....."+ uploadCount);
            param.put("mu", "1");
            List<Map<String, String>> fList = fileList;
            Map<String, String> fm = (Map)fList.get(index);
            for(long i = 0 ; i < uploadCount; i++) {
                param.put("n", "" + i);
                doMultipartUploadOne(url,i,blockSize, sessionId, uploadFile,param);
                rate = (int)((float)i / (float)uploadCount * 100);
                fm.put("RATE", ""+rate);
                updateUploadInfo(applet, fList);
            }
            fm.put("RATE", "100");
                updateUploadInfo(applet, fList);
                
        }
        
        /**
         * 
         */
        public static void doMultipartUploadOne(String url,long n, long blockSize, String sessionId, File uploadFile, Map param) {
          try {
            long skip = n * blockSize;
            RandomAccessFile fin = new RandomAccessFile(uploadFile, "r");
            fin.seek(skip);
            long fileSize = fin.length();
            long uploadSize = (skip + blockSize > fileSize) ? fileSize - skip : blockSize;
            URL u = new URL(url);
            byte[] form_part = getFormData(param);
            byte[] end_data = ("\r\n--" + boundary + "--\r\n").getBytes();   
            long size = form_part.length + uploadSize + end_data.length;
            HttpURLConnection con = (HttpURLConnection)u.openConnection();
            con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.addRequestProperty("Cookie","JSESSIONID="+sessionId);
            con.addRequestProperty("Connection","Keep-Alive");
            con.addRequestProperty("Cache-Control", "no-cache");
            con.setRequestProperty("Content-Type","multipart/form-data; boundary="+boundary);
            con.setRequestProperty("Content-Length",String.valueOf(size));
            DataOutputStream out = new DataOutputStream(con.getOutputStream());
            out.write(form_part);
            StringBuffer headerBuf = new StringBuffer();
            headerBuf.append("Content-Disposition: form-data; name=\"file\"; filename=\"")
                     .append(uploadFile.getAbsolutePath()).append("\"\r\n");
            headerBuf.append("Content-Type: application/octet-stream\r\n\r\n"); 
            out.write(headerBuf.toString().getBytes());
            int rn2 = 0;
            long loadLen = 0L;
            byte[] buf2 = new byte[1024];   
            while((rn2=fin.read(buf2, 0, 1024))>0)   
            {   
                if(loadLen + rn2 >= blockSize){
                    out.write(buf2,0,(int)(uploadSize - loadLen));  
                    break;
                } else {
                 out.write(buf2,0,rn2); 
                    loadLen += rn2;
                }
                   
            } 
            out.write(end_data);
            out.flush();
            out.close();
            fin.close();
            InputStream in = con.getInputStream();
            StringBuffer respBuffer = new StringBuffer();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line = new String();
            while((line = reader.readLine())!= null) {
                respBuffer.append(line);
            }
            fin.close();
            con.disconnect(); 
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (MalformedURLException e) {
            e.printStackTrace();
          } catch (IOException e) {
            e.printStackTrace();
          }
        } public static byte[] getFormData(Map<String, String> param)  throws IOException {
         StringBuffer buf = new StringBuffer();
         buf.append("--").append(boundary).append("\r\n");
         for(Iterator itr = param.keySet().iterator();itr.hasNext(); ){
                Object key = itr.next();
                System.out.println("key:="+key.toString());
                if(null != key && key instanceof String) {
                    String sKey = (String)key;
                    buf.append("Content-Disposition: form-data; name=\"").append(sKey).append("\"\r\n\r\n");
                    buf.append((String)param.get(sKey)).append("\r\n");
                    buf.append("--").append(boundary).append("\r\n");
                }
            }
         return buf.toString().getBytes();
        }
      

  5.   

    放到applet中调用,需要签名,具体晚上我传个包到csdn上你参考下
      

  6.   

    刚去看了applet,貌似applet是不能访问本地系统的文件的?
    :为了防止这样的问题出现,在缺省的情况下,大多数浏览器在Applet安全方面受到诸多的限制,几乎不能对系统进行任何“读”或“写”的操作:   1. 不允许Applet访问本地文件系统 是不是activex控件就可以比较顺利的完成我想要的功能?
      

  7.   

    可以访问本地,要将jar包签名。我那段代码就是从applet中copy的
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="vfs" default="war" basedir=".">

    <property name="project.dir" value="." />
    <property name="project.name" value="vfs" />
    <property name="dist.dir" value="${project.dir}/dist" />
    <property name="deploy.dir" value="${dist.dir}/${project.name}" />
    <property name="web.dir" value="${project.dir}/src/webroot" />
    <property name="lib.dir" value="${project.dir}/lib" />
    <property name="src.dir" value="${project.dir}/src" />
    <property name="java.applet.dir" value="${src.dir}/applet/java" />
    <property name="java.server.dir" value="${src.dir}/server/java" />
    <property file="build.properties" />
    <property environment="env" />
    <property name="jarsigner" value="${env.JAVA_HOME}/bin/jarsigner.exe"/> 
    <path id="main-class-path">
    <fileset dir="${lib.dir}" >
                <include name="*" />
        </fileset>
        <fileset file="${j2ee.jar}" />
        </path>

    <target name="compile.applet" depends="init">
    <javac destdir="${project.dir}/build/applet" deprecation="false" 
    debug="true" failonerror="true" target="1.5" optimize="false">
    <src path="${java.applet.dir}" />
    <classpath refid="main-class-path" />
    </javac>
        </target>

    <target name="compile.server" depends="init">
    <javac destdir="${project.dir}/build/server" deprecation="false" 
        debug="true" failonerror="true" target="1.5" optimize="false">
    <src path="${java.server.dir}" />
    <classpath refid="main-class-path" />
    </javac>
        </target>


    <target name="init">
    <mkdir dir="${project.dir}/dist" />
    <mkdir dir="${deploy.dir}" />
    <mkdir dir="${project.dir}/build/applet" />
    <mkdir dir="${project.dir}/build/server" />
    </target>

    <target name="clean">
    <echo message="Remove the dist file" />
    <delete dir="${deploy.dir}" />
    <delete dir="${project}/build/applet" />
    </target>

    <target name="Generate_key"  description="生成数字证书" >
      <echo message="生成数字证书...." />
      <genkey alias="swan" storepass="${storepass}" keypass="${keypass}" validity="${validity}" keystore="${keystore.file}">
       <dname>
        <param name="CN" value="${dname.CN}" />
        <param name="OU" value="${dname.OU}" />
        <param name="O" value="${dname.O}" />
        <param name="C" value="${dname.C}" />
        <param name="L" value="${dname.L}" />
        <param name="ST" value="${dname.ST}" />
       </dname>
      </genkey>
      <echo message="证书生成成功." />
     </target>

    <target name="war" depends="init,compile.applet,compile.server">
    <mkdir dir="${dist.dir}/tmp" />
    <mkdir dir="${deploy.dir}/WEB-INF/lib" />
    <copy todir="${dist.dir}/tmp">
    <fileset dir="${project.dir}/build/applet" />
    </copy>
    <copy todir="${deploy.dir}">
    <fileset dir="${web.dir}" />
    </copy>
    <jar destfile="${deploy.dir}/upload_utils_frames/unsigned_upload.jar">
    <fileset dir="${dist.dir}/tmp" />
    </jar>
    <!-- 
    <genkey 
                keystore="${upload.keystore.filename}" 
                validity="3650" 
                alias="${upload.keystore.alias}" 
                storepass="${upload.keystore.storepass}">
                <dname>
                    <param name="CN" value="CN" />
                    <param name="OU" value="PAIC.COM" />
                    <param name="O"  value="PINGAN" />
                    <param name="L"  value="SZ" />
                    <param name="S"  value="GD" />
                    <param name="C"  value="ZH" />
                </dname>
            </genkey>
    -->
    <signjar
        signedjar="${deploy.dir}/upload_utils_frames/upload.jar"
        alias="${upload.keystore.alias}"
        jar="${deploy.dir}/upload_utils_frames/unsigned_upload.jar"
    storepass="${upload.keystore.storepass}"
        keystore="${upload.keystore.filename}"
    verbose="true" />

    <delete dir="${dist.dir}/tmp" />

    <copy todir="${deploy.dir}/WEB-INF/lib">
        <fileset dir="${lib.dir}" />
    </copy>

    <copy todir="${deploy.dir}/WEB-INF/classes">
    <fileset dir="${project.dir}/build/server" />
    </copy>

    </target>
    <!--
    <target name="signJar"> 
      <echo message="jarsigner..." /> 
      <exec executable="${jarsigner}" dir="${deploy.dir}/upload_utils_frames/"> 
       <arg line="-keystore"/> 
       <arg value="${upload.keystore.filename}"/> 
       <arg line="-storepass"/> 
       <arg value="${upload.keystore.storepass}"/> 
       <arg line="upload.jar"/> 
       <arg line="${upload.keystore.alias}"/> 
      </exec> 
        </target>
        -->
    </project>
      

  8.   

    非常感谢您的帮助,我会仔细研究的。
    目前换了一个方法,获取到图片的base64编码,将这个编码传到另外一个jsp页面里进行处理,生成一个文件并保存,好像有些希望
      

  9.   

    找个或自己写个OCX插件,applet需要客户端装JDK,非常的麻烦
      

  10.   

    这个应该是内部应用系统,如果是网站应用的话就不能自动上传了。内部系统可以让用户装jre