FormFile上传图片
FormFile 上传图片
早前我做JSP 项目的时候,用过jspSmartUpload 这个组件来上传和下载图片,但是现在做的是SSH 整合的项目,而struts 又提供了一个FormFile 类来做文件的上传和下载,如果还用jspSmartUpload 来做的话,有点说不过去,于是试着使用FormFile ,在把我的代码贴出来之前,先做几个说明。
1、 图片的保存
图片可以以二进制形式的字段blob 保存在数据库(我用的是MYSQL ),但是我使用的方法是把图片保存在文件夹,而图片的路径以string 形式保存在数据库,下次展现图片的时候,直接在数据库找到路径就行
2、 struts+hibernate保存图片
struts+hibernate整合项目保存图片时候,除了struts 的FormFile 起主要作用外,hibernate 做了什么?其实hibernate 所做的事和保存图片没太大的关系,只是把路径保存了
3、 struts 保存图片除了配置文件外,我只了建3个文件(Action 、Form 、Jsp )。
下面给出我3个文件完整的代码,代码可以正确运行保存图片,如果把我的代码拷贝到你机器上运行,请看代码的注释
文件一Index.Jsp 代码如下
String path = request.getContextPath();
String basePath =
request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
">
My JSP 'index.jsp' starting page
请注意这行代码 后面那个enctype 属性是设置表单中有图片要提交,而且值是固定的multipart/form-data
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 UploadAction extends Action {
UploadForm uploadForm=(UploadForm)form; //表单转换 FormFile formFile= uploadForm.getFormFile(); //struts把图片文件封public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
装在uploadForm 的属性里面
/** * 下面是构建文件以什么路径保存:(关键部分) * getServlet().getServletContext().getRealPath("/images")是取得tomcat 中项目路径下images 文件夹的根路径,把我的代码拷到你项目里时候,要到你项目根路径里建images 文件夹
String path = * 在我这里是C:\Tomcat 6.0\webapps\imgUpload\images * 最后path 值就是C:\Tomcat 6.0\webapps\imgUpload\images\yyf.jpg。 * 接下来FormFile 把图片以这个路径保存 */
getServlet().getServletContext().getRealPath("/images") + "/" + formFile.getFileName();
saveFile(formFile, path); //调用自己写的保存图片的方法 /** * 到了这里图片可以保存到文件夹,但是hibernate 还什么事都没做 * 下面就可以用hibernate 生成的DAO 把path 保存到数据库了,这个不是今天的重点,省略
*/
} private String saveFile(FormFile file, String filePath) { String saveResult = "" ; try { InputStream is = file.getInputStream(); //得到输入流,OutputStream os = new FileOutputStream(filePath); //得到输出 return null ; 就是把图片从程序放进内存的流 流,就是把图片从内存放进硬盘文件的流
int readSize = 0; //余下的代码固定的,copy 就是了
byte buffer[] = new byte [1024];
while ((readSize = is.read(buffer, 0, 1024)) != -1) { } e.printStackTrace(); os.write(buffer, 0, readSize); } catch (Exception e) {
}
} 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 UploadForm extends ActionForm {
public void setFormFile(FormFile formFile) { } public ActionErrors validate(ActionMapping mapping, } return null ; HttpServletRequest request) { this . formFile = formFile; public FormFile getFormFile() { } return formFile ; private FormFile formFile =null ; //只有这个一个属性
{
}
}
这样就可以上传图片了,但是我运行时候抛出了空指针异常,原来我用的是SSH 整合的框架 ACTION 配置中有这个
type ="org.springframework.web.struts.DelegatingActionProxy"
struts 的ACTION 类交给spring 来代理,也就是ACTION 对象不是直接由ActionServlet 创建的,而是spring 创建的,所以在UploadAction 中getServlet().getServletContext()不能找到正确的路径,改成 request.getSession().getServletContext()就可以了。