WEB文件上传可能是网站建设中最常用的功能之一,我在项目开发中几乎都需要实现文件上传功能.前段时间自己搜集了一些上传组件.这篇文章中将介绍这些组件的使用方法,并且比较各自的优劣.
一,smartupload组件.
我想只要做个文件上传的朋友都知道这个组件,我认识的人中使用最多的也是它!我刚到公司的时候,公司也使用的smartupload,这个组件上传相对较小的文件时是个不错的选择.下面给出个使用的例子:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="com.jspsmart.upload.*" %>
<%
//实例化上载bean
SmartUpload mySmartUpload=new SmartUpload();
//初始化
mySmartUpload.initialize(pageContext);
//设置上载的最大值,注意:如果这里设置过大会出现问题!
mySmartUpload.setMaxFileSize(500 * 1024*1024);
//上载文件
mySmartUpload.upload();
//循环取得所有上载的文件
for (int i=0;i<mySmartUpload.getFiles().getCount();i++){
//取得上载的文件
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);
if (!myFile.isMissing())
{
//取得上载的文件的文件名
String myFileName=myFile.getFileName();
//取得不带后缀的文件名
String suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));
//取得后缀名
String ext= mySmartUpload.getFiles().getFile(0).getFileExt();
//取得文件的大小
int fileSize=myFile.getSize();
//保存路径
String aa=getServletContext().getRealPath("/")+"jsp\\";
String trace=aa+myFileName;
//取得别的参数
String explain=(String)mySmartUpload.getRequest().getParameter("text");
String send=(String)mySmartUpload.getRequest().getParameter("send");
//将文件保存在服务器端
myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);
%>
但是使用smartupload上传过大文件,或者多文件的时候可能出现CPU或内存占用过高的问题.并且:只有重新启动容器才能恢复正常!这正是我最后我放弃了使用smartupload的原因.
================================================================================================
二,commons-fileupload组件
这个组件是我现在使用的组件,下载地址:http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi,包内包含了API文档.
使用该组件的例子:
<%@ page language=“java”contentType=“text/html;charset=GBK”%>
<%@ page import=“java.util.*”%>
<%@ page import=“org.apache.commons.fileupload.*”%>
<html>
<head>
<title>文件上传</title>
</head>
<%
DiskFileUpload fu = new DiskFileUpload();
// 设置允许用户上传文件大小,单位:字节
fu.setSizeMax(10000000);
// 设置最多只允许在内存中存储的数据,单位:字节
fu.setSizeThreshold(4096);
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath(“D:\\Tomcat5\\TEMP”);
//开始读取上传信息
List fileItems = fu.parseRequest(request);
// 依次处理每个上传的文件
Iterator iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
//忽略其他不是文件域的所有表单信息
if (!item.isFormField()) {
String name = item.getName();
item.write(“D:\\UploadTest\\”+ name);
}
}
%>
从上面的程序可以看出,该组件上传时候可以用了一个地方来存储临时文件,呆上传完成后直接把文件写过去.这样就不会占用过多的内存!而且该组件上传大文件的时候效率也不低哦!
在这两个的对比选择中,我选择了后者,因为我做的项目中经常上传大于10M的文件,用前者的时候服务器几乎被整崩溃.
不过,现在我已经不用这两种组件了,因为http方式传文件效率始终很低,我们现在使用的是web方式实现的ftp文件上传,我将在下篇文章中写我在项目中是如何实现的.
============================================================================================
就上面的一些资料我们开始懂得怎么进行文件上传了
但是现在问题出来了
============================================================================================
commons-fileupload 参数传递
============================================================================================
1:如果要传参,数据量不是太大的话,可以用get 的带参方法.即 form action 里的upload.jsp后面跟上参数.
例如:upload.jsp?id=1&bid=2&uid=somebody
表单的类型不变.这样在upload.jsp 处理上传文件数据之前可以用request.getParameter("id")来获取参数.
这是一种在传参的数据量不大的情况之下比较可行的方法.
2:如果确实没有办法,必须跟文件域一起提交到上传组件里处理.据网友所说.可以采用如下<nobr>代码</nobr>处理.
public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {
DiskFileUpload fileUpload = this.fileUpload;
String enc = determineEncoding(request);
// use prototype FileUpload instance if the request specifies
// <nobr>it</nobr>s own encoding that does not match the default encoding
if (!enc.equals(this.defaultEncoding)) {
fileUpload = new DiskFileUpload();
fileUpload.setSizeMax(this.fileUpload.getSizeMax());
fileUpload.setSizeThreshold(this.fileUpload.getSizeThreshold());
fileUpload.setRepositoryPath(this.fileUpload.getRepositoryPath());
fileUpload.setHeaderEncoding(enc);
}
try {
List fileItems = fileUpload.parseRequest(request);
Map parameters = new HashMap();
Map multipartFiles = new HashMap();
for (Iterator it = fileItems.iterator(); it.hasNext();) {
FileItem fileItem = (FileItem) it.next();
if (fileItem.isFormField()) {
String value = null;
try {
value = fileItem.getString(enc);
}
catch (UnsupportedEncodingException ex) {
logger.warn("Could not decode multipart item '" + fileItem.getFieldName() +
"' with encoding '" + enc + "': using platform default");
value = fileItem.getString();
}
String[] curParam = (String[]) parameters.get(fileItem.getFieldName());
if (curParam == null) {
// simple form field
parameters.put(fileItem.getFieldName(), new String[] { value });
}
else {
// array of simple form fields
String[] newParam = StringUtils.addStringToArray(curParam, value);
parameters.put(fileItem.getFieldName(), newParam);
}
}
else {
// multipart file field
CommonsMultipartFile file = new CommonsMultipartFile(fileItem);
multipartFiles.put(file.getName(), file);
if (logger.isDebugEnabled()) {
logger.debug("Found multipart file [" + file.getName() + "] of size " + file.getSize() +
" bytes with original filename [" + file.getOriginalFilename() + "], stored " +
file.getStorageDescription());
}
}
}
/***** 注意 parameters 就是普通的text之类的字段的值 *****/
return new DefaultMultipartHttpServletRequest(request, multipartFiles, parameters);
}
catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(this.fileUpload.getSizeMax(), ex);
}
catch (FileUploadException ex) {
throw new MultipartException("Could not parse multipart request", ex);
}
}
使用方法是:
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
然后就能正常读取参数:
multipartRequest.getParameter("xxx");
===============================================================================================
版权声明:以上资料转载于网络,原文章出处没找到,谢谢原创的作者。(feohoo)
分享到:
相关推荐
在网络上找到的,纯JSP实现的文件上传程序,支持多文件的上传,例子是多文件的上传,稍微修改就可以变成单文件的上传或者更多文件的上传,控制成需要扩展名的文件上传,指定大小的文件上传等。程序目前上传文件存储...
NULL 博文链接:https://jingrenlang.iteye.com/blog/356351
jspSmart组件实现文件上传 jspSmart组件实现文件上传 jspSmart组件实现文件上传 jspSmart组件实现文件上传 jspSmart组件实现文件上传 jspSmart组件实现文件上传 jspSmart组件实现文件上传 jspSmart组件实现文件上传
NULL 博文链接:https://systemxgl.iteye.com/blog/267472
jsp无组件文件上传,不用多说,都明白啥意思
使用jspSmartUpload组件在jsp中实现上传和下载
jsp 文件 上传 的..组件 大家可以下下去看看
jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。该组件有以下几个特点: 1、使用简单。在JSP文件中仅仅书写三五行JAVA代码就可以...
Jsp 上传 jsp无组件上传 纯源码 无组件 jsp无组件上传 纯源码 可上传多个文件
使用jspSmartUpload实现文件上传下载,包含SmartUpload方法注解、上传示例及组件包
JSP无组件实现WEB上传,界面很差,但是功能正常,可以在提交文件的时候同时提交数据进数据库,提交的文件存放在指定文件夹中。本程序使用MYSQL数据库,代码中附有数据表结构,压缩包中附有该上传程序使用的类
jsp 上传组件,上传文件 xiaoxiangfileupload 2.0 jsp 上传组件,上传文件 xiaoxiangfileupload 2.0 jsp 上传组件,上传文件 xiaoxiangfileupload 2.0
jsp上传文件必备组件,经本人测试完全可以使用
下载即可运行,但是这个压缩包不支持中文名称的文件下载功能,我上传了一个可以下载中文的不会乱码的jspSmartUpload 组件,网址:http://download.csdn.net/detail/huahuahailang/4265620 照着使用,即可下载中文。
使用JSP实现上传下载文件jspSmartUpload 里面讲述怎么用jsp实现
在Servlet中使用jspsmart文件上传组件(最新版本)
WEBOFFICE组件jspsmart上传文件组件源码
直接可以运用的上传下载文件组件,jspsmart,而且提供数据库读写类,直接将上传下载文件信息写到数据库里面
精心准备了一个极品的jsp上传组件,内有上传...还有更好的通用js页面上传代码(含使用说明),负责多文件上传的动态显示(记住这是通用的啊),使用更是方便。有了这两个5分钟解决多文件上传问题。免费赠送,你还等什么?
jsp实现文件上传功能组件 在smartUpload组件的基础上进一步封装,使用简单 方便. 里面有使用说明。