浏览 3707 次
锁定老帖子 主题:applet下载图片的实现
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-16
由于安全性的限制applet在向客户端读写文件的时候需要证书验证,而考虑到BS结构不方便给在所有用户上安装证书认证,所以产生了问题。 解决方案: 1. Applet生成文件流; 2. Applet将文件流通过url连接传给服务器端; 3. 服务器端将文件流保存成服务器端指定目录的文件,为了防止文件名冲突,以当前时间的微秒数new Date().getTime()命名文件; 4. 服务器端将文件名回传给Applet; 5. Applet调用java Script 打开新的浏览器页面调用下载指定文件的url; 6. 利用smartUpload实现服务器端指定文件名文件的下载。 部分代码示例: -------------------------------------------------------------------------------------------------------------------------------------- Applet端代码; -------------------------------------------------------------------------------------------------------------------------------------- public void doOutPic(){ try{ Image image=null; BufferedImage imageBuffer = graph.getImage(Color.WHITE,10); URL url = new URL(getCodeBase(),"/unuba/dayActionGraphPicAction.do"); URLConnection con = url.openConnection(); con.setUseCaches(false); con.setDoOutput(true); con.setRequestProperty("Content-type", "application/octest-stream"); // 写入对象 OutputStream out = con.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(imageBuffer); out.flush(); out.close(); DataInputStream in = new DataInputStream(con.getInputStream()); ObjectInputStream objStream; objStream = new ObjectInputStream(in); String fileName = (String) objStream.readObject(); try { //getAppletContext().showDocument(new URL("javascript:doAlert(\"" + fileName +"\")")); URL destination=new URL(getCodeBase(),"/unuba/uba/downloadDayActionGraph.jsp?fileName="+fileName); getAppletContext().showDocument(destination,"_blank"); } catch (MalformedURLException me) { me.printStackTrace(); } }catch(Exception e){ e.printStackTrace(); } } ---------------------------------------------------------------------------------------------------------------------------------------- 服务器端代码: ---------------------------------------------------------------------------------------------------------------------------------------- public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //response.setContentType("application/octest-stream"); InputStream input=null; FileOutputStream output=null; byte[] buffer = new byte[1024]; try{ input=request.getInputStream(); Date now =new Date(); String fileName=now.getTime()+".jpg"; String path=request.getRealPath("/graphpic")+"/"+fileName; this.outPutFileName(response,fileName); output = new FileOutputStream(path); int b; while (true) { if (input.available() < 1024) { while ((b = input.read()) != -1) { output.write(b); } break; } else { input.read(buffer); output.write(buffer); } } input.close(); //output.flush(); output.close(); }catch(Exception e) { logger.error("can not get BufferedImage"); e.printStackTrace(); return null; } return null; } // output the graph picture file name private void outPutFileName(HttpServletResponse response,String fileName){ try { if (fileName == null) { return; } OutputStream out; ObjectOutputStream objStream; out = response.getOutputStream(); objStream = new ObjectOutputStream(out); objStream.writeObject((Object) fileName); } catch (Exception e) { logger.error("write output stream exception ", e); } } ---------------------------------------------------------------------------------------------------------------------------------------- smartUpload下载文件的代码: ---------------------------------------------------------------------------------------------------------------------------------------- <%@ page contentType="text/html; charset=UTF-8" import="com.jspsmart.upload.*" %> <% // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 初始化 su.initialize(pageContext); // 设定contentDisposition为null以禁止浏览器自动打开文件, //保证点击链接后是下载文件。 su.setContentDisposition(null); // 下载文件 String fileName=request.getParameter("fileName"); if(fileName!=null){ su.downloadFile("/graphpic/"+fileName); } %> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |