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()就可以了。