struts1实现上传

 使用Struts1实现文件上传(一)html

      完成文件上传功能大体须要如下几个步骤:  java

     (1)建立用于文件上传的JSP页面;web

     (2)建立用于承载数据的ActionForm;sql

     (3)建立用于处理上传的Action;数据库

     (4)配置文件上传大小;apache

     (5)配置从web.xml文件中读取文件存放路径;数组

 

步骤一:建立用于文件上传的JSP页面服务器

Java代码oracle

[java] view plaincopyapp

  1. <html:form enctype="multipart/form-data" action="/fileUpload" method="post">  

  2.           <html:file property="uploadFile"></html:file>  

  3.           <html:submit>Upload File</html:submit>  

  4. </html:form>   

步骤二:建立用于承载数据的ActionForm

      在项目中新建一个ActionForm的子类,如命名为:FileUploadForm.java,在其中新增一个FormFile类型的属性uploadFile,并设置getter、setter方法。

Java代码

[java] view plaincopy

  1. import org.apache.struts.upload.FormFile;  

  2.   

  3. private FormFile uploadFile;  

  4.           public FormFile getUploadFile() {  

  5.           return uploadFile;  

  6. }  

  7.           public void setUploadFile(FormFile uploadFile) {  

  8.           this.uploadFile = uploadFile;  

  9. }   

      在Struts中,一个FormFile类型的对象对应Form表单中创送的一个文件,Struts将上传的文件信息封装金FormFile中,经过FormFile提供的方法能够方便的进行文件的操做。其实FormFile是一个接口,位于 org.apache.struts.upload.FormFile 中,它定义了操做上传文件的基本方法。

      FormFile接口定义的经常使用方法:

      (1) getFileName()/setFileName()   //用于获取或设置文件名;

      (2) getFileSize() / setFileSize()      //用于获取或设置文件字节数;

      (3) getFileData()                           //用于获取文件的字节数组,用于小的文件;

      (4) getInputStream()                    //用于获取文件的输入流,用于较大的文件;

      (5) destory()                                 //销毁FromFile;

 

步骤三:建立用于处理上传的Action

 

      在项目中新建一个Action的子类,如命名为:FileUploadAction.java,在其execute方法中添加处理代码。

Java代码

[java] view plaincopy

  1. public ActionForward execute(ActionMapping mapping, ActionForm form,  

  2.         HttpServletRequest request, HttpServletResponse response) {  

  3.       

  4.     FileUploadForm fileUploadForm = (FileUploadForm) form;  

  5.     FormFile uploadFile = fileUploadForm.getUploadFile();  

  6.     try {  

  7.         FileOutputStream outer = new FileOutputStream("d:\\"+uploadFile.getFileName());  

  8.         byte[] buffer = uploadFile.getFileData();  

  9.         outer.write(buffer);  

  10.         outer.close();  

  11.         uploadFile.destroy();  

  12.     } catch (Exception e) {  

  13.         e.printStackTrace();  

  14.     }  

  15.     return null;  

  16.       

  17. }  

      在代码中能够看到,咱们从FileUploadForm中找到了FormFile类型的属性,经过其提供的方法获得文件的信息,并将其存入服务器的磁盘中。在保存的过程当中须要用到文件流的一些基本操做。

 

      到此为止,文件的上传已经基本成功,剩下的两步为配置文件上传大小和从web.xml文件中读取文件存放路径,能够选择学习。

 

步骤四:配置文件上传大小

 

      在Struts中能够配置上传文件的大小,以免服务器的硬盘消化不良。

      打开项目中WebRoot\WEB-INF\struts-config.xml ,切换至源码视图,在其中添加以下节点信息,即可以控制上传文件的大小了。

Xml代码

[xml] view plaincopy

  1. <controller maxFileSize="8K"></controller>  

      其中maxFileSize属性的单位能够是K,也能够是M或G;Struts在写 FormFile类时借助的是fileupload中的API,设置的默认大小为250M

      注意:操做struts-config.xml文件时应当特别注意各个节点间的顺序,由于Struts要求配置文件的各个元素顺序有必定的要求,顺序一旦被打乱,也就意味着web容器即将进入瘫痪状态,所以在添加<controler>节点时,要将此节点添加在<action-mapping>和<message-resources>节点之间。

     附:Struts-config.xml配置文件各元素的顺序列表。

Xml代码

[xml] view plaincopy

  1. The content of element type "struts-config" must match "(display-name?,description?,form-beans?,global-exceptions?,global-forwards?,action-mappings?,controller?,message-resources*,plug-in*)".  

 

 步骤五:配置从web.xml文件中读取文件存放路径

 

       在步骤三中的代码中咱们已经看到,在保存文件时,我写的是一个固定的存放路径,有没有什么办法让它动态改变呢?答案是确定的,Struts提供了一些方法能够读取web.xml中读取数据,那么咱们能够把存放的路径存放在web.xml文件中,存储文件时再将路径读取出来。这样作的好处是,若是存放路径发生改变,咱们只须要修改配置文件,而不须要改动代码。

 

       打开项目WebRoot\WEB-INF\web.xml , 找到一个servlet,在该servlet的节点下添加以下代码:

Xml代码

[xml] view plaincopy

  1. <init-param>  

  2.   <param-name>path</param-name>  

  3.   <param-value>d:\uploadFolder\</param-value>  

  4. </init-param>  

       要想读取此节点的信息,在处理上传文件的Action代码中加入以下代码:

Java代码

[java] view plaincopy

  1. //如下两行代码任选其一;  

  2. String path = this.getServlet().getInitParameter("uploadpath");  

  3. String path = this.getServlet().getServletConfig().getInitParameter("uploadpath")  

       到此基于Struts的文件上传操做已经基本完成。


使用Struts1实现文件上传(二)

使用Struts1实现文件上传(一)中,我将文件保存在服务器端的硬盘里,有没有办法将其保存在Oracle10g数据库中呢?答案是确定的,只须要对程序稍加改造就能够实现将文件保存在数据库中。用到时再将文件从数据库中还原出来供用户下载。

      在数据库中保存文件的方法和保存其余基本数据类型相差很少,只是要存入便可,可是其对应的数据类型比较特殊,通常选择二进制的数据类型。Oracle10g中提供了RAW和Long RAW数据类型,这两中数据类型用于保存二进制的数据;二进制类型的好处在于当数据在不一样系统之间传输时,能够不作任何数据类型的转换,方便了系统之间的操做。RAW类型的最大宽度为2000字节,而Long RAW类型的最大宽度能够达到2GB,很是适合保存图像、声音、视频等数据量较大的数据。

 

      所以,要想将文件保存在数据库中用到时在取出来,就要完成三个步骤:

 

      (1)新建Oracle10g数据表,在表中添加Long RAW类型的字段;

      (2)在程序中将上传的文件以流的形式保存到数据库中;

      (3)将文件从数据库中还原出来。

 

1、新建Oracle10g数据表

 

      在Oracle10g中新建一张数据表,如命名为UploadFiles,在表中添加相应的字段;

Sql代码

[sql] view plaincopy

  1. create table UploadFiles  

  2. (  

  3.   fileId      number not null,  

  4.   fileName    varchar2(100) not null,  

  5.   fileContent long raw not null,  

  6.   filePubDate date not null  

  7. )  

      其中FileContent即是用来存放文件的Long RAW二进制数据类型。

 

2、将上传文件保存在数据库

 

      剩下的工做即是在程序中编写代码将用户上传的文件保存在数据库中了,主要的代码已经在文章“使用Struts1实现文件上传(一)”中实现,如今只须要将原来保存在文件中的部分代码替换为保存在数据库的代码便可。

Java代码

[java] view plaincopy

  1. UploadForm uploadForm = (UploadForm) form;  

  2. FormFile uploadFile = uploadForm.getUploadFile();  

  3.   

  4. Connection conn = null;  

  5. PreparedStatement ps = null;  

  6.   

  7. try {  

  8.       

  9.     Class.forName("oracle.jdbc.driver.OracleDriver");  

  10.     conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:DataBaseName","username","password");  

  11.     String sql = "insert into pic (fileName,fileContent,filePubDate) values (?,?,?)";  

  12.     ps = conn.prepareStatement(sql);  

  13.     ps.setString(1, uploadFile.getFileName());  

  14.     ps.setBinaryStream(2, uploadFile.getInputStream(), uploadFile.getFileSize());  

  15.     ps.setDate(3new Date());  

  16.     ps.executeUpdate();  

  17.       

  18. catch (Exception e) {  

  19.     e.printStackTrace();  

  20. }  

      当用户点击上传后就能够将文件存储在数据库中了。

 

3、将文件从数据库中还原出来

 

      当用户须要用到文件时,就须要从数据中将文件查询出来,方法也很简单,看代码:

 

Java代码

[java] view plaincopy

  1. Connection conn = null;  

  2. PreparedStatement ps = null;  

  3. ResultSet rs = null;  

  4.   

  5. <strong>InputStream input = null;</strong>  

  6.   

  7. try {  

  8.       

  9.     Class.forName("oracle.jdbc.driver.OracleDriver");  

  10.     conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:DataBaseName","username","password");  

  11.     String sql = "select * from UpLoadFiles where id = 3";  

  12.     ps = conn.prepareStatement(sql);  

  13.     rs = ps.executeQuery();  

  14.     if(rs.next()){  

  15.         <strong>input = rs.getBinaryStream("pic");</strong>  

  16.     }  

  17.       

  18.     //根据须要操做InputStream对象的代码;  

  19.   

  20.       

  21. catch (Exception e) {  

  22.     e.printStackTrace();  

  23. finally {  

  24.     try {  

  25.         rs.close();  

  26.         ps.close();  

  27.         conn.close();  

  28.     } catch (Exception e) {  

  29.         e.printStackTrace();  

  30.     }  

  31. }  

      将文件从数据库中读取出来后获得的将是一个InputStream类型的对象,能够根据须要操做这个对象还原文件。

相关文章
相关标签/搜索