SSH,JSP用FormFile实现文件上传功能

时间:2022-02-22 04:17:39

1、  图片的保存

    图片可以以二进制形式的字段blob保存在数据库(MYSQL),但是我使用的方法是把图片保存在文件夹,而图片的路径以string形式保存在数据库,下次展现图片的时候,直接在数据库找到路径就行。

 

2、  struts+hibernate保存图片

    struts+hibernate整合项目保存图片时候,除了struts的FormFile起主要作用外,hibernate做了什么?其实hibernate所做的事和保存图片没太大的关系,只是把路径保存了。

 

3、  struts保存图片除了配置文件外,我只了建3个文件(Action、Form、Jsp)。

 

    下面给出我3个文件完整的代码,代码可以正确运行保存图片,如果把我的代码拷贝到你机器上运行,请看代码的注释。

 

文件一Index.Jsp代码如下 

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

   

    <title>My JSP 'index.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

    <!--

    <link rel="stylesheet" type="text/css" href="styles.css">

    -->

  </head>

 

  <body>

   <form action="upload.do" method="post" enctype="multipart/form-data">

      <input type="file" name="formFile" /><br/>

      <input type="submit" value="添加"/><br/>

   </form>

  </body>

</html>

 

     请注意这行代码<form action="upload.do" method="post" enctype="multipart/form-data">   后面那个enctype属性是设置表单中有图片要提交,而且值是固定的multipart/form-data

 

文件二UploadAction.java代码如下

  

 

package com.yourcompany.struts.action;

 

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.upload.FormFile;

 

import com.yourcompany.struts.form.UploadForm;

 

 

public class UploadActionextends Action {

 

    public ActionForward execute(ActionMapping mapping, ActionForm form,

           HttpServletRequest request, HttpServletResponse response) {

 

       UploadForm uploadForm=(UploadForm)form;        //表单转换

       FormFile formFile= uploadForm.getFormFile();      //struts把图片文件封装在uploadForm的属性里面

      

       /**

        * 下面是构建文件以什么路径保存:(关键部分)

        * getServlet().getServletContext().getRealPath("/images")是取得tomcat中项目路径下images文件夹的根路径,  把我的代码拷到你项目里时候,要到你项目根路径里建images文件夹

        * 在我这里是C:\Tomcat 6.0\webapps\imgUpload\images

        * 最后path值就是C:\Tomcat 6.0\webapps\imgUpload\images\yyf.jpg。

        * 接下来FormFile把图片以这个路径保存

        */

   

       String path = getServlet().getServletContext().getRealPath("/images") + "/" + formFile.getFileName();

       saveFile(formFile, path);      //调用自己写的保存图片的方法    

 

       /**

        * 到了这里图片可以保存到文件夹,但是hibernate还什么事都没做

        * 下面就可以用hibernate生成的DAO把path保存到数据库了,这个不是今天的重点,省略

        */   

       return null;

    }

   

    private String saveFile(FormFile file, String filePath) {

       String saveResult = "";

       try {     

           InputStream is = file.getInputStream();                             //得到输入流,就是把图片从程序放进内存的流

           OutputStream os = new FileOutputStream(filePath);      //得到输出流,就是把图片从内存放进硬盘文件的流

 

           int readSize = 0;                                                              //余下的代码固定的,copy就是了

           byte buffer[] =new byte[1024];

           while ((readSize = is.read(buffer, 0, 1024)) != -1) {

              os.write(buffer, 0, readSize);

           }

       } catch (Exception e) {

           e.printStackTrace();

       }

       return saveResult;

    }

}

 

文件三UploadForm.java  这里面我只建了一个属性

 

package com.yourcompany.struts.form;

 

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.upload.FormFile;

  

public class UploadFormextends ActionForm {

     

    private FormFile formFile=null;          //只有这个一个属性

   

    public FormFile getFormFile() { 

       return formFile;

    }

 

    public void setFormFile(FormFile formFile) {

       this.formFile = formFile;

    }

     

    public ActionErrors validate(ActionMapping mapping,

           HttpServletRequest request) {

        

       return null;

    }

 

    public void reset(ActionMapping mapping, HttpServletRequest request) {

        

    }

}

 

这样就可以上传图片了,但是我运行时候抛出了空指针异常,原来我用的是SSH整合的框架

ACTION配置中有这个

 

type="org.springframework.web.struts.DelegatingActionProxy"  

 

struts的ACTION类交给spring来代理,也就是ACTION对象不是直接由ActionServlet创建的,而是spring创建的,所以在UploadAction中getServlet().getServletContext()不能找到正确的路径,改成 request.getSession().getServletContext()就可以了。

相关文章