zoukankan      html  css  js  c++  java
  • Servlet学习三——传输文件

         最先在考虑传输文件时,想通过java写一个文件上传案例,传给Servlet,Servlet再保存至数据库中,但苦于一直没找到实例,听说Flex有实际的例子,就直接用Flex例子来测试了。本文的顺序为:Flex测试代码,数据库接收代码,Sql与Oracle数据库处理的区别。

          1.Flex中文件上传的范例代码:

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    			   xmlns:s="library://ns.adobe.com/flex/spark" 
    			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    	<fx:Script>
    		<![CDATA[
    			import mx.controls.Alert;
    			
    			private var imageFR:FileReference = new FileReference();
    			
    			protected function loadstaphotoB_clickHandler(event:MouseEvent):void
    			{
    				//
    				var ff:FileFilter = new FileFilter("图片文件 (*.jpg, *.aac)","*.jpg; *.aac;");
    				imageFR.addEventListener(Event.SELECT, selectimageHandler);
    				imageFR.browse([ff]);
    			}
    			
    			private function selectimageHandler(event:Event):void {
    				//增加一个文件加载load完成后的listener	
    				imageFR.addEventListener(Event.COMPLETE, onLoadimageComplete);
    				imageFR.load(); //加载用户选中文件
    			}
    			
    			private function onLoadimageComplete(event:Event):void
    			{			
    //				var request:URLRequest = new URLRequest("http://localhost:8400/DataDemoServer/StaImageSave");
    				var request:URLRequest = new URLRequest("http://192.168.169.26:8080/bb/TestFlexServlet");
    //				var request:URLRequest = new URLRequest("http://192.168.169.26:8080/SSCTaxi/SendOrderServlet");
    				request.method = URLRequestMethod.POST;
    				imageFR.addEventListener(Event.COMPLETE,imageUploadComplete);
    				imageFR.addEventListener(IOErrorEvent.IO_ERROR,uploadError);
    				
    				imageFR.upload(request,imageFR.name);
    			}
    			
    			private function imageUploadComplete(event:Event):void
    			{				
    				Alert.show("上传图片成功!", "抱歉", 4, this);
    			}
    			
    			private function uploadError(event:IOErrorEvent):void
    			{
    				Alert.show("上传图片失败!", "抱歉", 4, this);
    			}
    		]]>
    	</fx:Script>
    	<s:layout>
    		<s:BasicLayout/>
    	</s:layout>
    	<fx:Declarations>
    		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
    	</fx:Declarations>
    	<s:Button label="上传" click="loadstaphotoB_clickHandler(event)"/>
    </s:Application>
    

         有了上传文件的测试代码,就可以开始着手写接收流的代码了。

         2.接收流的代码:

    ServletInputStream stream;
    		try {
    			stream = request.getInputStream();
    			int streamLength = request.getContentLength();
    			PassengerDAO dao = new PassengerDAO();
    			String result = dao.insertMsg(stream, streamLength);
    
    			try {
    				PrintWriter out = response.getWriter();
    				out.println(result);
    				out.flush();
    				out.close();
    
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		} catch (IOException e1) {
    			// TODO Auto-generated catch block
    			e1.printStackTrace();
    		}
    

      在完成接收流代码过程中,走了不少弯路,主要体现在两方面:InputStream和流长度获取。 

          1).InputStream:最初写流的获取时,因想通过Java自己写一个上传的,找了不少资料,主要使用【commons-fileupload-1.3】这个包,最初自己也用了这个包,使用这个包来获取流,DiskFileItemFactory——ServletFileUpload——FileItem等等,各个步骤,步骤很繁琐,但最后也得到了InputStream。直到最后数据库需要从Oracle换到SQL时,自己才意识到可以直接从Request.getInputStream直接获取输入流,这个时候真的是感叹自己舍本逐末。

          2).流长度获取:在Oracle中使用Blob字段,可以通过Blob.getBinaryOutputStream方法获取输出流后,使用InputStream往输出流中写数据,但数据库换成SQL后,使用了SQL中Image字段,这时往数据库中写入流是通过setBinaryStream,这个方法需要传入流的大小,但流的大小是无从所知的。查了很多知道,都说available方法在网络传输是不稳定的,在网络传输中获取大小为0,测试了一把,果然是零,难道我需要将流先存成文件,再获取文件大小?相信网络获取流肯定有其他人实现过,继续找,后来在一篇网文中看到了Request.getContentLength,再次感受到了根基差带来的劣势,很多东西都需要积淀,没有过硬的能力不要想一蹴而就。

         3.Sql与Oracle存储区别

         1)时间字段

         Oracle里使用的是Timestamp,很方便,但在获取前需要设置连接的时区,类似【((OracleConnection) conn).setSessionTimeZone("GMT");】,在SQL中使用的是smalldatetime,不需要设置时区,能设置默认值为当前时间,估计Oracle也有,但自己没有去摸索;

         2)大字段

         大字段的区别在前面已经提了,Blob不需要提前了解InputStream的长度,但Image字段需要。

          

    欢迎访问SuperMap技术问答社区http://qa.supermap.com/
  • 相关阅读:
    hdu6060[贪心+dfs] 2017多校3
    Codeforces 547B. Mike and Feet[单调栈/队列]
    Codeforces 545E. Paths and Trees[最短路+贪心]
    gitignore使用
    es学习
    google浏览器安装jsonview
    sychronized关键字底层详解加锁升级过程
    idea 中 “XXX has broken path” 错误解决
    kafka高并发读写的原因
    window redis版本 安装
  • 原文地址:https://www.cnblogs.com/emily_fly/p/3486538.html
Copyright © 2011-2022 走看看