`
haofeng82
  • 浏览: 144408 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

fileUpload控件使用方法介绍(有试例源代码哦!)

阅读更多
使用FileUpLoad包进行文件上传。
进行文件上传一般有三种方式
使用fileUpLoad
使用smartFileUpLoad
自己编写类似的程序进行解析
下面介绍一下第一种方式的使用方法:
fileUpLoad是apache的一个开源项目,用来进行解析带有文件的请求处理。著名的struts的FormFile就是用的它进行解析处理的。
1首先页面上我们需要将表单设置下面类似的参数:
< form method="post" enctype="multipart/form-data" action=”………… ” >
2 然后我们需要在工程里导入所需要的包,可以在apache网站上下载:
3 在我们的servlet中可以获取到request参数,然后可以这样取传递过来的字段参数及文件参数:
在这里我写了两个类去生成并存储字段和文件的值:
可以跟着红色的注释代码看一下实现的过程
/**
*@authorsxy
*
*封装了FileUpload类,实现文件上传功能
*
*/
publicclass FileUploadUtil {
privatestatic Logger logger = Logger.getLogger(FileUploadUtil.class);
public HttpServletRequest request;
//这个是FileUpLoad控件的实际处理的request数据的类对象
DiskFileUpload fu;
//用来存储解析后的字段和文件数据
List fileItems;
//字段名与字段值的映射 String--Vector
HashMap fieldsMap=new HashMap();
//字段名与相对UploadedFile的映射
HashMap filesMap=new HashMap();
/**构造函数,遍历所有字段,分别存入文件MAP和字段MAP
*@paramrequest
*@paramtempDirectory
*@throwsBaseWebException
*/
//当生成一个类时就开始了对request传递过来的数据的解析
public FileUploadUtil(HttpServletRequest request,String tempDirectory) throws Exception {
this.request = request;
//这一句很重要,以前我没有加上,结果UTF-8编码时老是出现乱码问题,最后还是看了Struts的文件上传源代码是这样写的,才解决了乱码问题
String encoding=request.getCharacterEncoding();
fu = new DiskFileUpload();
fu.setSizeMax(44194304); //设置文件大小.
fu.setSizeThreshold(4096);
fu.setHeaderEncoding(encoding);
fu.setRepositoryPath(tempDirectory); //设置临时目录.
try {
//解析参数,在后面进行文件字段和普通字段值的进一步处理
fileItems = fu.parseRequest(request); //解析请求,返回一个集合.
}
catch (FileUploadException e) {
thrownew Exception(e);
}
Iterator i = fileItems.iterator();
//遍历解析好的参数,以区分文件还是普通字段,并作相应的处理(存入不同的hashMap)
while(i.hasNext())
{
FileItem fi = (FileItem)i.next();
//判断当前项是否为普通字段
if(fi.isFormField()) //这是用来确定是否为文件属性,
{
Vector vec=new Vector();
//需改正
String fieldName = fi.getFieldName(); //这里取得字段名称
//如果已经存在此字段信息(多选列表或多个同名的隐藏域等)
if(fieldsMap.get(fieldName)!=null)
{
vec=(Vector)fieldsMap.get(fieldName);
logger.info("value: fi.getString(request.getCharacterEncoding()));
//很重要!需要进行编码哦!!!
vec.add(fi.getString(request.getCharacterEncoding()));
}
//第一次取到这个名的字段
else
{
logger.info("value: "+fi.getString(request.getCharacterEncoding()));
vec.add(fi.getString(request.getCharacterEncoding()));
fieldsMap.put(fieldName,vec);
}
}
//为文件字段时
else
{
//传来的文件名不为空时
String fullName=fi.getName();
if(fullName!=null&&!("".equals(fullName)))
{
//这里是一个封装好的类型,封装的不太好,其中的getRealName()不//好用,但是获取扩展名和文件名的方法还是可以的。
UploadedFile uploadedFile=new UploadedFile(fi);
filesMap.put(fi.getFieldName(),uploadedFile);
}
}
}
}// FileUploadUtil
/**
*模仿request的getParameter方法,取得非文件的字段
*如果为多个值的,只返回第一个
*@paramparam
*@return为空或键值不存在返回null
*/
public String getParameter(String param)
{
if(param==null)
{
returnnull;
}
else
{
Vector vec=(Vector)fieldsMap.get(param);
if(vec!=null&&vec.size()>0)
{
return (String)vec.get(0);
}
elsereturnnull;
}
}//getParameter
public String[] getParameterValues(String param)
{
String[] values=null;
if(param==null)
{
returnnull;
}
else
{
Vector vec=(Vector)this.fieldsMap.get(param);
int size=vec.size();
values=new String[size];
if(vec!=null&&vec.size()>0)
{
for(int i=0;i<size;i++)
{
values[i]=(String)vec.get(i);
}
return values;
}
else
{
returnnull;
}
}//else
}
/**
*
*返回上传的文件的名称,如若没这个参数名,返回null
*@paramparamName
*@return
*/
public String getFileName(String paramName)
{
if(paramName!=null)
{
UploadedFile uploadedFile=(UploadedFile)this.filesMap.get(paramName);
if(uploadedFile!=null)
{
return uploadedFile.getRealName();
}
}
returnnull;
}
/**
*这个方法用来将文件字段保存在硬盘上。
*@paramparamName
*@paramnewNameWithoutExt
*@paramrelativePath
*@throwsBaseWebException
*/
publicvoid upLoadFile(String paramName,String newNameWithoutExt,String relativePath) throws Exception
{
if(paramName!=null)
{
UploadedFile uploadedFile=(UploadedFile)this.filesMap.get(paramName);
if(uploadedFile!=null&&uploadedFile.fileItem.getSize()>0)
{
String path=request.getSession().getServletContext().getRealPath("/");
path+=relativePath+newNameWithoutExt;
uploadedFile.write(path);
}
}
}
publicstaticvoid main(String[] args)
{
}
public List getFileItems() {
returnfileItems;
}
publicvoid setFileItems(List fileItems) {
this.fileItems = fileItems;
}
public HashMap getFieldsMap() {
returnfieldsMap;
}
publicvoid setFieldsMap(HashMap fieldsMap) {
this.fieldsMap = fieldsMap;
}
public HashMap getFilesMap() {
returnfilesMap;
}
publicvoid setFilesMap(HashMap filesMap) {
this.filesMap = filesMap;
}
public DiskFileUpload getFu() {
returnfu;
}
publicvoid setFu(DiskFileUpload fu) {
this.fu = fu;
}
public HttpServletRequest getRequest() {
returnrequest;
}
publicvoid setRequest(HttpServletRequest request) {
this.request = request;
}
}
//辅助的文件封装字段,还很不完善,比如缺少获取文件流的方法,以后考虑创建adapter
//来实现封装对象fileItem的一些方法。这里主要提供了获取扩展名和文件名的方法,比较//简陋
publicclass UploadedFile {
private String fullName="";
public FileItem fileItem;
/**
*@paramfileItem
*/
public UploadedFile(FileItem fileItem) {
this.fileItem = fileItem;
fullName=fileItem.getName();
}
public String getFileNameWithoutExt()
{
returnnull;
}
//返回文件的扩展名
public String getExt()
{
String[] values= fullName.split("\\.");
return values[values.length-1];
}
//不好用这个方法!!
public String getRealName()
{
String[] values= fullName.split("\\\\\\");
return values[values.length-1];
}
publicString getBaseFileName() {
// First, ask the JDK for the base file name.
String fileName = new File(this.fileItem.getName()).getName();
// Now check for a Windows file name parsed incorrectly.
int colonIndex = fileName.indexOf(":");
if (colonIndex == -1) {
// Check for a Windows SMB file path.
colonIndex = fileName.indexOf("\\\\");
}
int backslashIndex = fileName.lastIndexOf("\\");
if (colonIndex > -1 && backslashIndex > -1) {
// Consider this filename to be a full Windows path, and parse it
// accordingly to retrieve just the base file name.
fileName = fileName.substring(backslashIndex + 1);
}
return fileName;
}
publicvoid write(String path) throws Exception
{
try {
fileItem.write(new File(path));
} catch (Exception e) {
thrownew Exception(e);
}
}
}
使用方法就是分的简单了:

FileUploadUtil fu;
fu = new FileUploadUtil(request,"c:/");
String name=fu.getParameter("name");
logger.info("字段名; name ,值:"+name);
Map fileMap=fu.getFilesMap();
UploadedFile ufile=(UploadedFile) fileMap.get("myFile");
…………
下面要做的工作就是保存到数据库中或硬盘上了,下次再说哦!!
写得不好,希望大家多提意见
分享到:
评论

相关推荐

    ASP.NET.FileUpload控件

    在设计视图中,可以从工具箱中拖拽FileUpload控件到网页上,或者在源代码视图中手动添加以下代码: ```html &lt;asp:FileUpload ID="FileUpload1" runat="server" /&gt; ``` `runat="server"`属性使控件在服务器端可用,...

    一个漂亮的fileupload控件

    在这里,描述提到这个控件是网上找到的源代码,意味着它可能是一个开源或者共享的项目,开发者可以自由下载、使用甚至修改来适应自己的项目需求。 首先,我们来探讨一下FileUpload控件的基本功能。在传统的HTML中,...

    用FileUpload控件上传文件到数据库

    ### 使用ASP.NET中的FileUpload控件将文件上传至数据库 #### 概述 在Web开发中,经常需要处理用户上传的文件,例如头像、文档等。这些文件可能需要存储在服务器的文件系统中,也可能直接存入数据库。本文将详细...

    Asp.net 2.0 用FileUpload 控件实现多文件上传

    在本文中,我们将深入探讨如何利用FileUpload控件实现多文件上传功能,并通过源代码分析来帮助理解其实现原理。 首先,我们需要明白在Asp.net 2.0中,单个FileUpload控件默认只支持单个文件的上传。为了实现多文件...

    net使用FileUpLoad控件上传文件.

    要在 ASP.NET 页面中添加 `FileUpload` 控件,可以在设计视图或源代码视图中插入如下代码: ```html 请选择文件: &lt;asp:FileUpload ID="FileUpload1" runat="server" /&gt; 上传" OnClick="Button1_Click" /&gt; ...

    MetaBuiders组件源代码之FileUpload

    虽然.NET Framework 2005以后的版本提供了内置的FileUpload控件,但理解源代码可以帮助我们更好地定制和扩展功能,以满足特定的业务需求。因此,即使是现代开发,研究历史组件的源代码仍然具有深远的教育意义。

    Anthem.NET中FileUpload控件Ajax方式的文件上传

    在Anthem.NET中,FileUpload控件可能有一些额外的特性或配置,比如Ajax支持,以实现无刷新上传。 接着,我们关注`Default.aspx.cs`,这是页面的后台代码逻辑。在这个文件中,你需要编写事件处理程序来处理文件上传...

    VisualC#.net2008控件使用范例详解-源代码

    4. 文件操作:如何上传、下载和处理文件,例如使用FileUpload控件和FileStream类。 5. 用户界面交互:如使用TabControl控件创建多页布局,使用TreeView控件展示层次结构数据,或使用RadioButton和CheckBox实现单选和...

    ASP.NET 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字水印和图片的水印

    ### ASP.NET 使用FileUpload控件上传图片并自动生成缩略图、自动生成带文字水印和图片水印 #### 概述 在 ASP.NET 应用程序开发中,经常需要处理用户上传的文件,尤其是图片文件。本篇教程将详细介绍如何使用 ASP...

    FileUpload 文件上传组件的ASP.NET源码.rar

    FileUpload 文件上传组件的ASP.NET实例,基于主副窗口的上传程序,利用线程提升上传速度。本插件可支持多文件上传,为了提升上传体验... 解决FileUpload控件上传文件大小限制  ASP.NET中实现FileUpload多文件上传

    上传控件的使用方法,你会更加顺手

    1. **添加控件**:在ASP.NET Web Form中,只需在设计视图中从工具箱拖动FileUpload控件到页面上,或者在源代码视图中手动添加`&lt;asp:FileUpload ID="FileUpload1" runat="server" /&gt;`。 2. **选择文件**:在浏览器端...

    电子相册管理系统源代码

    源代码中,这通常通过OpenFileDialog控件实现,结合FileUpload组件将选中的图片文件保存到服务器或本地存储。 2. **照片浏览**:系统具备图片预览功能,用户可以在界面上查看已上传的照片。这涉及到Image控件的使用...

    Flex-FileUpload 改pdf,上传限制改成2M

    FileUpload组件通常会与一个表单控件一起使用,该表单控件包含一个FileReference对象,用户可以通过点击按钮选择文件。 在此次修改中,关键在于设置文件类型的过滤器。这通常通过修改组件的filters属性实现,它可以...

    asp.net fileupload控件上传图片并预览图片

    本篇内容主要介绍了如何利用*** FileUpload控件上传图片,并在上传后预览所选图片。通过构建一个*** Web表单页面,用户可以选择图片文件,点击上传按钮后,页面将显示所选图片,并将图片文件保存到服务器指定的目录...

    ASP.NET exl上传到gridview中 fileupload

    本教程将详细解释如何利用FileUpload控件实现这一功能,并结合GridView控件进行数据展示。 首先,我们需要在ASP.NET页面上创建必要的控件。一个FileUpload控件用于让用户选择要上传的Excel文件,一个Button控件触发...

    使用FileUpload上传图片实现图片预览

    本文将基于给定的代码片段,深入解析如何利用FileUpload控件实现图片的上传与预览,同时探讨其实现机制及注意事项。 ### 使用FileUpload上传图片实现图片预览 #### FileUpload控件简介 `FileUpload`是ASP.NET提供...

    ASP.NET 2.0网络编程自学手册源代码(文件上传与下载)

    人民邮电出版社的ASP.NET 2.0网络编程自学手册配套关盘中的第15章 文件按上传与下载的源代码,了解上传文件和下载文件的流程、学会使用FileUpload控件实现文件上传、学会动态添加控件的功能、掌握文件的下载。

    ASP.NET多文件上传,单文件上传,很好用【源代码】

    然而,由于ASP.NET的FileUpload控件不直接支持多文件,你需要借助JavaScript或jQuery来处理多个FileUpload控件,或者使用Ajax异步上传。服务器端代码则需要处理多个文件的接收和存储。 3. **源代码分析** 提供的源...

    ASP无组件上传工具源代码

    在处理文件上传时,ASP默认的FileUpload控件对于大文件上传存在限制,因此需要特别设计的解决方案。 "UpLoad_Class.inc"文件是此上传工具的核心源代码文件,它可能包含了一个自定义的上传类,用于处理文件的分块...

Global site tag (gtag.js) - Google Analytics