Struts实现图片上传功能【校验图片格式】+(每完成一个任务特别有成就感!)

mac2026-10-04  2

文章目录

题目要求项目感想附IE下文件上传,图片类型转换规则知识点拓展附上struts.xml模板代码项目Project(含源码)附上小黄鸡gif图智慧树《算法分析与设计》(推荐+个人感想+刘伟老师Orz)

题目要求

使用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在文件上传时,翻译图片格式的问题

附IE下文件上传,图片类型转换规则

firefoximage/jpegimage/bmpimage/gifimage/pngie 6image/pjpegimage/bmpimage/gifimage/x-pngie 7image/pjpegimage/bmpimage/gifimage/x-pngie 8image/pjpegimage/bmpimage/gifimage/x-png

知识点拓展

Action处理类: private File[] upload; // 用File数组来封装多个上传文件域对象 private String[] uploadFileName; // 用String数组来封装多个上传文件名 private String[] uploadContentType; // 用String数组来封装多个上传文件类型 或者 private List<File> upload; // 用List集合来封装多个上传文件域对象 private List<String> uploadFileName; // 用List数组来封装多个上传文件名 private List<String> uploadContentType; // 用List集合来封装多个上传文件类型

Struts 2支持直接在fileUpload 拦截器上设置参数来进行限制。

在引用fileUpload 拦截器的时候,可以指定3 个参数(指定子元素) :

allowedTypes指定允许上传的文件的类型, 如果存在多种类型,以逗号隔开。注意:这里添的不是文件的扩展名, 而是对应的ContentType。maximumSize指定允许上传的文件的最大字节数。allowedExtensions指定允许上传的文件的扩展名。

附上struts.xml模板代码

<packagename="default"namespace="/"extends="struts-default"> <actionname="upload"class="cn.itcast.user.action.FileUploadAction" method="upload"> <!-- 向FileUploadAction中传入上传文件的存放目录的参数值 --> <paramname="uploadPath">D:\</param> <!-- 引用fileUpload拦截器 --> <interceptor-refname="fileUpload"> <!-- 设置单个上传文件的大小,单位字节 --> <paramname="maximumSize">20000000</param> <!-- 设置单个上传文件的扩展名为jpg,多个扩展名之间通过","号分隔 --> <paramname="allowedExtensions">.jpg</param> <!-- 设置单个上传文件的MIME类型,多个类型之间通过","号分隔 --> <paramname="allowedTypes">image/jpeg</param> </interceptor-ref> <!-- 当显示声明使用某一具体拦截器时,那么默认拦截器栈中的18个拦截器就不起作用了 如果又要默认拦截器栈中的拦截器有作用的话,又需显示声明使用默认拦截器栈 --> <interceptor-refname="defaultStack"/> <resultname="input">/upload.jsp</result> <result>/success.jsp</result> </action> </package>

如果上传的文件不满足以上的参数指定的条件,则会跳转到一个叫input的上, 一般input 都会指回到提交之前的页面,也就是文件上传页面(这个在我的项目struts.xml里面看看就明白了~)

项目Project(含源码)


效果图

附上小黄鸡gif图

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 每完成一个任务让我特别有成就感! 冲冲冲~

智慧树《算法分析与设计》(推荐+个人感想+刘伟老师Orz)

学如逆水行舟,不进则退 一百个Chocolate 认证博客专家 博客专家 博客之星 前端开发攻城狮 掘金搜【一百个Chocolate】座右铭:学如逆水行舟,不进则退!公众号:小狮子前端 期待小狮子们的加入~
最新回复(0)