最先在考虑传输文件时,想通过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字段需要。

Servlet学习三——传输文件的更多相关文章

  1. Servlet学习四——传输文本

    在最初使用Servlet时,觉得get方法很好用,也了解到传输一般性的变量,除了文件流和安全性外,都可以用get方法,所以,也就习惯用get方法了. 在实现一个注册方法过程中,中文注册都是乱码,跟踪后 ...

  2. jsp/servlet学习三之会话管理初解

    由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...

  3. mybatis 学习三 关键文件解析

    1:  mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...

  4. Servlet学习(三)——实例:用户登录并记录登陆次数

    1.前提:在Mysql数据库下建立数据库web13,在web13下创建一张表user,插入几条数据如下: 2.创建HTML文件,命名为login,作为登录界面(以post方式提交) <!DOCT ...

  5. Mybatis基础学习(三)—映射文件

    一.输入映射 1.parameterType     指定输入参数的Java类,可以使用别名或者类的全限定名.它也可以接受基本数据类型.POJO对象.HashMap.   (1)基本数据类型   (2 ...

  6. python3.5.3rc1学习三:文件操作

    ##全局变量与局部变量x = 6 def printFuc(): y = 8 z =9 print(y + z) print(x) printFuc()#print(y)#常见错误##name = & ...

  7. Servlet学习三:不允许直接访问jsp处理方式一过滤器

    转自:http://zy19982004.iteye.com/blog/1755189

  8. Servlet学习:(三)Servlet3.0 上传文件

    转: Servlet学习:(三)Servlet3.0 上传文件 2018年08月03日 11:57:58 iDark_CSDN 阅读数:362   一.注意事项 客户端(浏览器) 表单的提交方法必须是 ...

  9. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

随机推荐

  1. 给flash添加A链接

    项目中,曾有一个需求,给flash广告添加链接,跳转到另一个网站.于是直接在html的flash object前面加上<a href="url">,发现链接不起作用. ...

  2. maven dependencies 里面的包怎么导出

    进入工程pom.xml 所在的目录下,输入以下命令:mvn dependency:copy-dependencies -DoutputDirectory=lib更简单的 mvn dependency: ...

  3. log_format为Nginx设置日志格式

    nginx服务器日志相关指令主要有两条,一条是log_format,用来设置日志格式, 另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,一般在nginx的配置文件中日记配置 ...

  4. TortoiseSvn客户端出现Http state 405 'Method Not Allowed' 的解决办法

    原文地址链接 http://stackoverflow.com/questions/28247512/visualsvn-server-3-2-unexpected-http-status-405 就 ...

  5. C++ const用法总结

    1 const分顶层const,底层const2 顶层const可以表示任意类型的对象是常量.eg:     const int i:i是一个整型常量    int *const ccc:ccc是指向 ...

  6. XML中& <> 单引号' 双引号 " 报错

    由于xml中 这些字符是特殊字符,所以把&改成&  就行了 ,注意后面一定要带一个分号; <         <         小于号>         >  ...

  7. [C#对Oracle操作]C#操作调用Orcale存储过程有参数

    /// <summary> /// 获取ERP固定资产计提数据 /// </summary> /// <param name="strCompanyCode&q ...

  8. OS X 系统,修改hosts文件后不生效的问题

    系统版本 OS X El Capitan,10.11.2 问题描述 业务需要,配置“nexus”为某个ip,如下图更改了 /etc/hosts 文件. 结果在ping的时候,请求并未发到指定ip上. ...

  9. 关于python中文件导入的若干问题

    __init__文件 同一级目录下直接import导入就可以了,如果是在不同的目录下面被导入文件的文件夹下面必须有__init__.py文件,即使这个文件是空的也可以.当然这个文件也可以初始一些数据 ...

  10. tomcat7 ajax请求服务中文乱码

    在确保请求服务编码格式为utf-8的情况下,确保tomcat的配置 <Connector connectionTimeout="20000" port="8080& ...