项目文件下载:http://dl2.csdn.net/down4/20070805/05202416228.zip
TODO 2007/08/04-2007/08/05
完成时间:2007年8月5日
文件上传和下载
一些需要注意的地方:
在处理到文件上传和下载的时候首先说明一些需要注意的地方。
1) 使用HTML默认的功能不能上传目录,这里的默认功能指的是不做额外的开发(例如ActiveX)的情况下。
所以客户如果跟你说:“我有一个目录需要上传,能不能让我选择目录,然后一下子上传整个目录?”,出于工作量的考虑你最好回绝他,然后使用动态增加的方式来动态的支持多个上传文件,或者更简单的让客户指定所有的上传文件。
2) 不能设置文件上传字段的默认值。
出于安全的考虑,HTML不支持默认的文件上传字段的默认值。例如,在你不知道的情况下,你访问了某个网站的某个页面,结果你的password文件被上传上去了,哈哈,你有危险了。
所以如果客户跟你说:“我能不能打开画面的时候就设置好上传的文件?”,处于工作量和技术难度的考虑,你最好说:“哦,为了您的安全,还是不要这样子做了”,呵呵,
3)文件类型
每一种文件都有类型,一般情况下扩展明决定了文件的类型。。所有文件类型的列表可以从这个目录中找到,相信可以为你提供参考:
TOMCAT_HOME\conf\web.xml
…
<mime-mapping>
<extension>bin</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
<mime-mapping>
<extension>gif</extension>
<mime-type>image/gif</mime-type>
</mime-mapping>
…
4) 下载文件时本页面内部打开,还是弹出另存对话框?
文件下载的时候可以在本页面打开,和可以弹出另存对话框。选择条件是设置文件下载的:contentDisposition,inline表示当前页面打开,attachment表示弹出另存对话框。
例如:
contentDisposition=inline;filename="image.jpg" 当前画面打开
contentDisposition=attachment;filename="image.jpg" 打开另存对话框
5)文件上传需要使用method="post" 和 enctype="multipart/form-data"类型的form
使用Struts2上传文件:
Struts文件上传需要使用File Upload Filter。Filter Upload Filter使用一些默认的规则:
Form中的<s:file name="image"></s:file>标签对应着Action类中的三个属性分别是:上传文件(java.io.File类型),文件名(java.lang.String类型),文件类型(java.lang.String类型,例如:image/jpeg)。命名规约为:
文件:名字与<s:file>标签中的name属性一致,这里为:image
文件名:文件 + FileName,这里为:imageFileName
文件类型:文件 + ContentType,这里为:imageContentType
所以针对上述<s:file name="image"></s:file>表示啊的上传文件的JSP和Action类被别为:
imageUpload.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>Image Upload</title></head>
<body>
<h1> Image Upload Page </h1>
<s:form action="imageUpload" method="post" enctype="multipart/form-data">
<s:file name="image"></s:file>
<s:submit></s:submit>
</s:form>
</body>
</html>
ImageUploadAction.java:
package com.jpleasure;
import com.opensymphony.xwork2.ActionSupport;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ImageUploadAction extends ActionSupport {
private File image;
private String imageFileName;
private String imageContentType;
public File getImage() {
return image;
}
public void setImage(File image) {
this.image = image;
}
public String getImageFileName() {
return imageFileName;
}
public void setImageFileName(String imageFileName) {
this.imageFileName = imageFileName;
}
public String getImageContentType() {
return imageContentType;
}
public void setImageContentType(String imageContentType) {
this.imageContentType = imageContentType;
}
public String execute() {
if (image != null) {
System.out.println("file name is:" + this.imageFileName);
System.out.println("file content type is:" + this.imageContentType);
System.out.println("file length is:" + this.image.length());
}
return SUCCESS;
}
}
Struts.xml配置文件:
<action name="imageUpload" class="com.jpleasure.ImageUploadAction">
<result>/success.jsp</result>
</action>
这样当我们选中上传文件,提交的时候:文件内容会以File类型的方式放在image声明的变量中。文件的名字将会被放在imageFileName命名的变量中,文件的类型被放在imageContentType命名的变量中。
文件下载:
文件下载需要使用一个特殊的Result,stream类型的Result。Stream类型的Result主要用来处理文件下载操作。
处理原理为:所有的下载文件都是将一个二进制的流写入到HttpResponse中去。在Action类中定义一个InputSream类型的二进制流,在Result返回给用户的时候返回给用户。
扩展上述的代码,将上传来的文件直接下载给用户:
ImageUploadAction中需要追加一个InputSream类型的对象,并且指向上传的文件,代码如下,红色部分表示变化:
package com.jpleasure;
import com.opensymphony.xwork2.ActionSupport;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ImageUploadAction extends ActionSupport {
private File image;
private String imageFileName;
private String imageContentType;
private InputStream imageInputStream = null;
public InputStream getImageInputStream() {
return imageInputStream;
}
public void setImageInputStream(InputStream imageInputStream) {
this.imageInputStream = imageInputStream;
}
public File getImage() {
return image;
}
public void setImage(File image) {
this.image = image;
}
public String getImageFileName() {
return imageFileName;
}
public void setImageFileName(String imageFileName) {
this.imageFileName = imageFileName;
}
public String getImageContentType() {
return imageContentType;
}
public void setImageContentType(String imageContentType) {
this.imageContentType = imageContentType;
}
public String execute() {
if (image != null) {
System.out.println("file name is:" + this.imageFileName);
System.out.println("file content type is:" + this.imageContentType);
System.out.println("file length is:" + this.image.length());
try {
this.imageInputStream = new FileInputStream (image);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
return SUCCESS;
}
}
配置文件为,红色为变化部分:
<action name="imageUpload" class="com.jpleasure.ImageUploadAction">
<result name="success" type="stream">
<param name="contentType">image/pjpeg</param>
<param name="inputName">imageInputStream</param>
<param name="contentDisposition">attachment;filename="image.jpg"</param>
<param name="bufferSize">1024</param>
</result>
</action>
ContentType表示下载文件的类型。
InputName表示Action类中用来下载文件的字段的名字。
ContentDisposition用来控制文件下载的一些信息,包括是否打开另存对话框,下载文件名等。
BufferSize表示文件下载时使用的缓冲区的大小。
实际项目开发的考虑:
控制上传文件的类型和最大允许上传文件的size
使用File Upload Intercepter的参数可盈控制上传文件的类型和最大允许上传文件的size。例如:
<struts>
<package name="myPackage" extends="struts-default">
<interceptor-ref name="fileUpload">
<param name="maximumSize">2MB</param>
<param name="allowedTypes">text/html,image/jpeg</param>
</interceptor-ref>
<interceptor-ref name="basicStack"/>
<action name="imageUpload" class="com.jpleasure.ImageUploadAction">
<result name="success" type="stream">
<param name="contentType">image/pjpeg</param>
<param name="inputName">imageInputStream</param>
<param name="contentDisposition">
attachment;filename="image.jpg"
</param>
<param name="bufferSize">1024</param>
</result>
</action>
</package>
</struts>
上述表示允许上传jpeg和html类型的文件,且最大文件上传size为2MB
显示错误信息:
可以使用如下key表示的message来显示文件上传出错的提示信息:
消息Key
|
说明
|
struts.messages.error.uploading
|
文件无法正常上传时的公共错误
|
struts.messages.error.file.too.large
|
文件大小超过最大允许size时的错误提示
|
struts.messages.error.content.type.not.allowed
|
文件类型不在上传文件允许类型中的错误提示
|
分享到:
相关推荐
附录2-监测系统XML上传格式文档.pdf
将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载。 为求完整性,就把附录也上传了。哈哈
DDR5 UDIMM规范附录A JESD308-U0-RCA_v1:描述了x8颗粒单rank UDIMM的设计细节 DDR5 UDIMM规范附录B JESD308-U0-RCB_v1:描述了x8颗粒双rank UDIMM的设计...DDR5 UDIMM的通用标准文档我也上传了,可到我主页免费下载。
真正的数据库原理编程与性能第2版(中文...不好意思,由于不熟悉CSDN下载的积分规则,也许分成几个文件下载要扣几次分,已上传的2部分不能更改,所以第3部分设为1分,第4部分设为0分. 如果4部分都评论的话,最后扣3+3+1-4=3分.
2023年全国大学生数学建模竞赛E题一等奖论文(附录源码)-基于小波变换和背包模型的小浪底水库最优监测方案研究 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的参赛作品,代码都测试ok,都是运行...
注意:因文件大小超过20M,所以分了3个文件上传。 《ActionScript 3.0 语言和组件参考》是 Flash® Player 和 Adobe® AIR® 应用程序编程接口 (API) 的参考手册。包括以下部分: 语言元素,如全局变量、运算符、...
注意:因文件大小超过20M,所以分了3个文件上传。 《ActionScript 3.0 语言和组件参考》是 Flash® Player 和 Adobe® AIR® 应用程序编程接口 (API) 的参考手册。包括以下部分: 语言元素,如全局变量、运算符、...
<项目介绍> 2023年全国大学生数学建模竞赛D题一等奖论文(附录源码)-圈养湖羊空间利用率的优化问题 - 不懂运行,下载完可以私聊问...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
<项目介绍> 2023年全国大学生数学建模竞赛B题一等奖论文(附录源码)-商超蔬菜销售数据的统计分析及建模 - 不懂运行,下载完可以...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
<项目介绍> 2023年全国大学生数学建模竞赛E题一等奖论文(附录源码)-基于时间序列分析预测的黄河水沙监测模型 ...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
<项目介绍> 2023年全国大学生数学建模竞赛B题一等奖论文(附录源码)-某商超蔬菜类商品动态定价与补货决策研究 ...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
<项目介绍> 2023年全国大学生数学建模竞赛B题一等奖论文(附录源码)-多波束测深合理探测方案的设计及效果分析 ...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
<项目介绍> 2023年全国大学生数学建模竞赛C题一等奖论文(附录源码)-基于价格弹性的蔬菜类商品自动定价与补货决策 ...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
如需进行其他高级配置,如“受保护的视图”文档预览、设置上下文等,可参考附录 二、启动服务 右键以管理员身份运行:D:\idocv\start.bat 三、验证服务 浏览器访问http://127.0.0.1/user/login 登录用户名/密码:...
一个简单的jsp上传实例,使用commons-fileupload实现。其代码已经上传在另外一个资源里。该文档也在附录中附了代码。
商家与支付宝接口:: 1 批量代发 1 ...5. 下载退票结果文件 30 5.1. 接口类型 30 5.1.1. 请求参数表 30 5.2. 退票文件 31 5.2.1. 文件名格式 31 5.2.2. 文件内容格式 31 6. 各银行错误描述附录。 34
第二篇 语言基础篇 语法基本概念 C语言的数据输入与输出 C语言程序结构设计 结构化程序设计技巧 第三篇 算法模型篇 实例一 百钱百鸡问题 实例二 分油趣题 实例三 婚礼上的诺言 ...附录三 reander.inc
第二篇 语言基础篇 语法基本概念 C语言的数据输入与输出 C语言程序结构设计 结构化程序设计技巧 第三篇 算法模型篇 实例一 百钱百鸡问题 实例二 分油趣题 实例三 婚礼上的诺言 ...附录三 reander.inc
文件上传 图像处理 单元测试 附录 A、常见问题集 B、3.2和5.0区别 C、助手函数 本文档使用 看云 构建- 2 - 零、序言 官方出品,入门TP5 必读系列 > 概述 ThinkPHP5.0 版本的优势在于: 更灵活的路由; 依赖注入; ...
真正的数据库原理编程与性能第2版(中文...不好意思,由于不熟悉CSDN下载的积分规则,也许分成几个文件下载要扣几次分,已上传的2部分不能更改,所以第3部分设为1分,第4部分设为0分. 如果4部分都评论的话,最后扣3+3+1-4=3分.