`
kobexing933
  • 浏览: 120321 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

附录三 文件上传和下载

阅读更多

项目文件下载: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
文件类型不在上传文件允许类型中的错误提示
分享到:
评论

相关推荐

    FCKeditor文件上传漏洞及利用-File-Upload-Vulnerability-in-FCKEditor1

    攻击者通常会利用此漏洞通过伪造文件头来欺骗服务器,使得服务器误认为上传的文件是安全的类型,如图片或文档。实际上,这些文件可能包含恶意的PHP代码,一旦被服务器接受并存储,攻击者就可以通过访问这些文件执行...

    附录2-监测系统XML上传格式文档.pdf

    附录2-监测系统XML上传格式文档.pdf

    招聘附录三离职申请审批表贵阳共2页.pdf.zip

    "招聘附录三离职申请审批表贵阳共2页.pdf.zip"是一个压缩文件,通常在IT领域中,这可能涉及到文件的归档、压缩和分享技术,如使用WinRAR或ZIP格式来减小文件体积便于传输。但是,这些是基础的文件操作,并非深入的IT...

    C#WCF和HTTP文件传输练习.zip

    WCF是.NET Framework中的一个组件,它提供了一种统一的方式来创建分布式应用程序,而HTTP则是互联网上广泛使用的传输协议,常用于文件的上传和下载。 首先,让我们详细了解WCF。WCF是一种服务导向架构,它允许...

    WCF和HTTP文件传输练习

    3. **文件流处理**:在服务方法中,使用`FileStream`类读取或写入文件,进行文件的上传和下载。 4. **安全性考虑**:为了确保文件传输的安全性,可能需要启用HTTPS(HTTP over SSL/TLS)来加密数据,同时可以配置WCF...

    DDR5 UDIMM Raw Card Annex ,DDR5 UDIMM规范附录A~E

    DDR5 UDIMM规范附录A JESD308-U0-RCA_v1:描述了x8颗粒单rank UDIMM的设计细节 DDR5 UDIMM规范附录B JESD308-U0-RCB_v1:描述了x8颗粒双rank UDIMM的设计...DDR5 UDIMM的通用标准文档我也上传了,可到我主页免费下载。

    数据库原理编程与性能第2版(中文10-11章及附录)

    真正的数据库原理编程与性能第2版(中文...不好意思,由于不熟悉CSDN下载的积分规则,也许分成几个文件下载要扣几次分,已上传的2部分不能更改,所以第3部分设为1分,第4部分设为0分. 如果4部分都评论的话,最后扣3+3+1-4=3分.

    校园网站的设计分析附录图片

    系统需确保文件的安全性,支持文件分类、大小限制,并记录下载次数和用户反馈。 3. **图片管理信息**:图片管理涉及上传、存储和展示图片,如学院活动照片、教学材料等。良好的图片管理系统需要有优化的图片处理...

    AS3.0中文版chm帮助文档_02

    注意:因文件大小超过20M,所以分了3个文件上传。 《ActionScript 3.0 语言和组件参考》是 Flash® Player 和 Adobe® AIR® 应用程序编程接口 (API) 的参考手册。包括以下部分: 语言元素,如全局变量、运算符、...

    腾讯产品文档-测试计划

    附录部分则包含了测试策略的详细标准和专业术语解释,增强了文档的完整性和专业性。 #### 3. 结论 腾讯的产品文档-测试计划不仅是一份详尽的操作指南,更是软件测试领域的一个典范。通过深入分析其内容,我们不仅...

    VC6从入门到精通-附录

    在附录中,你可能会学到如何使用MFC的网络类,如CInternetSession、CHttpConnection、CGopherConnection等,来连接到HTTP或Gopher服务器,以及如何进行文件上传和下载。 具体来说,这部分内容可能会包括以下几个...

    AS3.0中文版chm帮助文档_03

    注意:因文件大小超过20M,所以分了3个文件上传。 《ActionScript 3.0 语言和组件参考》是 Flash® Player 和 Adobe® AIR® 应用程序编程接口 (API) 的参考手册。包括以下部分: 语言元素,如全局变量、运算符、...

    附录B_by_yhc1

    SFTP插件支持编辑远程文件、上传文件、重命名和删除操作。编辑完成后,通过"Upload File"功能可快速将本地更改同步到远程服务器。此外,用户还可以通过"Map to Remote"创建多个远程服务器映射,方便将文件上传到不同...

    2023年全国大学生数学建模竞赛E题一等奖论文(附录源码)-基于小波变换和背包模型的小浪底水库最优监测方案研究

    2023年全国大学生数学建模竞赛E题一等奖论文(附录源码)-基于小波变换和背包模型的小浪底水库最优监测方案研究 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的参赛作品,代码都测试ok,都是运行...

    PHP基础教程(第4版)原文附录源码

    3. 文件操作:在"phpmysql4_scripts"中,可能会涉及读写文件、目录操作、上传下载等功能的源码。例如,fopen/fwrite/fclose用于文件读写,mkdir/rmdir用于目录管理,move_uploaded_file处理文件上传等。 4. MySQL...

    CAD_sample_sample.dwg_其他_

    7. **积分系统**:某些在线平台使用积分系统来激励用户上传和下载资源,积分可能代表用户参与度或贡献度。 8. **设计考核**:在教育或职业环境中,设计考核是检验设计师技能和理解力的标准方式,提交的CAD图纸会...

    多渠道平台接入接口规范-第5部分:附录(QCUP 035.5-2010).doc

    B.3 托管数据文件应答码:对于涉及托管数据交换的交易,如上传或下载交易记录,也设定了专门的应答码,确保数据传输的准确性和完整性。 5. **附录C - 支付方式类型、用户号码类型**: C.1 支付方式标识:定义了...

    附录4-10城市垃圾处理._ODName附录4-10 城市垃圾处理.rar

    很抱歉,根据您提供的信息,这个压缩包文件“附录4-10城市垃圾处理._ODName附录4-10 城市垃圾处理.rar”似乎与IT行业专业知识不直接相关。它可能包含的是关于城市垃圾处理的数据或报告,这通常属于环境科学或城市...

    2023年全国大学生数学建模竞赛D题一等奖论文(附录源码)-圈养湖羊空间利用率的优化问题

    &lt;项目介绍&gt; 2023年全国大学生数学建模竞赛D题一等奖论文(附录源码)-圈养湖羊空间利用率的优化问题 - 不懂运行,下载完可以私聊问...下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

Global site tag (gtag.js) - Google Analytics