使用Struts实现图片上传功能 要求对图片格式进行校验,即上传的文件必须是图片格式
为了完成这个作业,搜了好多好多资源,也是花了很多时间去看别人的,发现大多数博主没有提供一个项目源代码,大多数只有struts.xml文件 所以我整理了网上一部分知识和自己的项目 将这些分享出来
①IE在文件上传时,翻译图片格式的问题
报错信息如下
2011-01-11 11:10:02 DEBUG -falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@17d93a9] 2011-01-11 11:10:02 DEBUG -Validating /albums/upLoadPhoto with method upLoadPhoto. 2011-01-11 11:10:02 DEBUG -Invoking validate() on action com.pyj. web.ui.albums.PicAction@91e0a8 2011-01-11 11:10:02 DEBUG -cannot find method [validateUpLoadPhoto] in action [com.pyj.web.ui.albums.PicAction@91e0a8] 2011-01-11 11:10:02 DEBUG -cannot find method [validateDoUpLoadPhoto] in action [com.pyj.web.ui.albums.PicAction@91e0a8] 2011-01-11 11:10:02 DEBUG -Errors on action com.pyj.web.ui.albums.PicAction@91e0a8, returning result name 'input' 2011-01-11 11:10:02 WARN -Could not find action or result No result defined for action com.pyj.web.ui.albums.PicAction and result input从报错信息看是因为我在Action中没有配置validateUpLoadPhoto方法,没有通过Struts2的验证,所以Struts2自动返回input结果,但当我在Action中添加了validateUpLoadPhoto,方法体如下:
public void validateUpLoadPhoto(){ //空方法 }错误依然存在,接着我又在validateUpLoadPhoto方法中打出Struts2的所有错误信息: actionerror,actionmessage都为空,而fielderror却有错误信息.
phf:[Content-Type not allowed: phf "5.jpg" "upload__538d61dd_12d732b033c__8000_00000002.tmp" image/pjpeg]可以看到,IE把jpeg类型的文件翻译成了pjpeg,到此问题基本已经找出, 并不是没有validate()方法的原因,而是IE在文件上传时,翻译图片格式的问题
Struts 2支持直接在fileUpload 拦截器上设置参数来进行限制。
在引用fileUpload 拦截器的时候,可以指定3 个参数(指定子元素) :
allowedTypes指定允许上传的文件的类型, 如果存在多种类型,以逗号隔开。注意:这里添的不是文件的扩展名, 而是对应的ContentType。maximumSize指定允许上传的文件的最大字节数。allowedExtensions指定允许上传的文件的扩展名。如果上传的文件不满足以上的参数指定的条件,则会跳转到一个叫input的上, 一般input 都会指回到提交之前的页面,也就是文件上传页面(这个在我的项目struts.xml里面看看就明白了~)
效果图
index.jsp
<%@ page language="java" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <html> <head> <title>文件上传</title> </head> <body> <s:form action="myupload" method="post" enctype="multipart/form-data"> <s:file name="upload" label="上传的文件"></s:file> <s:submit value="上传"></s:submit> </s:form> </body> </html>success.jsp
<%@ page language="java" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>成功页面</title> </head> <body> 恭喜你!上传成功<br/> <img src="uploadimages/<s:property value='uploadFileName'/>"/> </body> </html>UploadAction.java
package com.test.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import com.sun.java_cup.internal.runtime.*; public class UploadAction extends ActionSupport{ private File upload; //上传文件 private String uploadFileName; //上传的文件名 //属性upload的get/set方法 public File getUpload() { return upload; } public void setUpload(File upload) { this.upload = upload; } //属性uploadFileName的get/set方法 public String getUploadFileName() { return uploadFileName; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } public String execute() throws Exception { InputStream is=new FileInputStream(getUpload()); //根据上传的文件得到输入流 String directory = "/uploadimages"; String targetDirectory = ServletActionContext.getServletContext(). getRealPath(directory); OutputStream os=new FileOutputStream(targetDirectory+"/"+ uploadFileName); //指定输出流地址 byte buffer[]=new byte[1024]; int count=0; while((count=is.read(buffer))>0){ os.write(buffer,0,count); //把文件写到指定位置的文件中 } os.close(); //关闭 is.close(); return SUCCESS; //返回 } }struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="default" extends="struts-default"> <action name="myupload" class="com.test.UploadAction"> <interceptor-ref name="fileUpload"> <!-- 配置允许上传的文件类型,多个用","分隔 --> <param name="allowedTypes"> image/bmp,image/png,image/gif,image/jpg </param> </interceptor-ref> <interceptor-ref name="defaultStack" /> <result name="input">/index.jsp</result> <result name="success">/success.jsp</result> </action> </package> <constant name="struts.multipart.saveDir" value="../tmp"></constant> </struts>最后,来宣传一波,进入大三前的暑假就在帮刘伟老师弄算法视频,终于上线了hhh 每完成一个任务让我特别有成就感! 冲冲冲~
