package com.cnblogs.zxub.upload;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.MultipartStream;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
/**
* @author zxub 2006-7-14 下午05:25:10 处理输入流,并提供相应信息
*/
public class HttpFileUpload extends FileUpload
{
// 有默认参数文件
public static ResourceBundle config = ResourceBundle.getBundle("config");
private static final long K = 1024;
private static final long M = 1024 * 1024;
// 默认的单个文件大小限制,0为无限制,配置文件中存放的为String类型
private long fileLimitSize = getByteSize(config.getString("fileLimitSize"));
// 默认的文件上传类型限制
private String allowFileTypes = config.getString("allowFileTypes");
// private String allowFiles = null; // 允许上传的文件类型,null表示无限制
private boolean allowField = false; // 是否允许处理非文件域,默认为否
private int reportLimitSize = 10240; // 最小报告长度,默认为10K
private StreamReport streamReport = null; // 上传进度处理对象
public HttpFileUpload()
{
super();
setSizeMax(getByteSize(config.getString("onceMaxSize")));
}
public HttpFileUpload(FileItemFactory fileItemFactory)
{
super(fileItemFactory);
setSizeMax(getByteSize(config.getString("onceMaxSize")));
}
public long getFileLimitSize()
{
return fileLimitSize;
}
public void setFileLimitSize(long fileLimitSize)
{
this.fileLimitSize = fileLimitSize;
}
public static long getByteSize(String size)
{
String unit = size.substring(size.length() - 1).toUpperCase();
String num;
if (unit.equals("K"))
{
num = size.substring(0, size.length() - 1);
return Long.parseLong(num) * HttpFileUpload.K;
}
else if (unit.equals("M"))
{
num = size.substring(0, size.length() - 1);
return Long.parseLong(num) * HttpFileUpload.M;
}
else
{
return Long.parseLong(size);
}
}
/**
* @return [String] 允许上传的文件类型
*/
public String getAllowFileTypes()
{
return allowFileTypes;
}
/**
* 设置允许上传的文件类型,默认是"",无限制
*
* @param allowFileTypes
*/
public void setAllowFileTypes(String allowFileTypes)
{
this.allowFileTypes = allowFileTypes;
}
public void addAllowFileTypes(String allowFileTypes)
{
this.allowFileTypes += ("," + allowFileTypes);
}
/**
* 设置是否允许上载除file以外的field的内容
*
* @param allow
*/
public void setAllowField(boolean allow)
{
allowField = allow;
}
/**
* @return [boolean] 是否允许上载除file以外的field
*/
public boolean isAllowField()
{
return allowField;
}
/**
* 设置最小报告长度,这个参数影响报告频度,默认是10K
*
* @param reportLimitSize
*/
public void setReportLimitSize(int reportLimitSize)
{
this.reportLimitSize = reportLimitSize;
}
public int getReportLimitSize()
{
return reportLimitSize;
}
/**
* 上传后清理工作
*/
public void dispose()
{
if (streamReport != null) streamReport.dispose();
}
/**
* 完成上传操作 根据allowField值决定是否接收除file以外的其它field,并检查上传的文件是否为允许的文件
*
* @param request
* @return
* @throws FileUploadException
* @throws IOException
*/
public List parseRequest(HttpServletRequest request)
throws FileUploadException
{
ServletRequestContext ctx = new ServletRequestContext(request);
if (ctx == null)
{
throw new NullPointerException(
"HttpFileUpload(parseRequestEx): ctx parameter");
}
ArrayList items = new ArrayList();
String contentType = ctx.getContentType();
if ((null == contentType)
|| (!contentType.toLowerCase().startsWith(MULTIPART)))
{
throw new InvalidContentTypeException(
"HttpFileUpload(parseRequestEx): the request doesn't contain a "
+ MULTIPART_FORM_DATA + " or " + MULTIPART_MIXED
+ " stream, content type header is " + contentType);
}
int requestSize = ctx.getContentLength();
if (requestSize == -1)
{
throw new UnknownSizeException("由于数据大小未知,上传被终止!");
}
long sizeMax = getSizeMax();
if (sizeMax >= 0 && requestSize > sizeMax)
{
throw new SizeLimitExceededException("由于文件总大小 [ " + requestSize
+ " ] 超出限定 [ " + sizeMax + " ],上传被终止!", requestSize,
sizeMax);
}
String charEncoding = getHeaderEncoding();
if (charEncoding == null)
{
charEncoding = ctx.getCharacterEncoding();
}
try
{
byte[] boundary = getBoundary(contentType);
if (boundary == null)
{
throw new FileUploadException(
"the request was rejected because "
+ "no multipart boundary was found");
}
streamReport = new StreamReport(request);
streamReport.init();
streamReport.setReportLimitSize(reportLimitSize);
InputStream input = ctx.getInputStream();
InputSteamEx inputEx = new InputSteamEx(input, streamReport);
MultipartStream multi = new MultipartStream(inputEx, boundary);
multi.setHeaderEncoding(charEncoding);
boolean nextPart = multi.skipPreamble();
List invalidFiles = new ArrayList();
while (nextPart)
{
Map headers = parseHeaders(multi.readHeaders());
String fieldName = getFieldName(headers);
if (fieldName != null)
{
String subContentType = getHeader(headers, CONTENT_TYPE);
if (subContentType != null
&& subContentType.toLowerCase().startsWith(
MULTIPART_MIXED))
{
// Multiple files.
// 由于一般传送文件时,设置的是multipart/form-data,所以这里不会进入
byte[] subBoundary = getBoundary(subContentType);
multi.setBoundary(subBoundary);
boolean nextSubPart = multi.skipPreamble();
while (nextSubPart)
{
headers = parseHeaders(multi.readHeaders());
if (getFileName(headers) != null)
{
FileItem item = createItem(headers, false);
OutputStream os = item.getOutputStream();
try
{
multi.readBodyData(os);
}
finally
{
在Java编程中,实现带进度条的文件上传和下载功能是一项常见的需求,特别是在Web应用中。这个源码可能包含了一个完整的解决方案,结合了Java后端处理和Ajax前端交互,以实时展示上传或下载的进度。下面我们将详细探讨相关知识点。 1. **Java后端处理**: - **Servlet**:Java后端通常会使用Servlet来处理HTTP请求,包括文件的上传和下载。Servlet是Java EE中用于扩展服务器功能的API,它可以接收并响应来自客户端的请求。 - **文件流处理**:在处理文件上传和下载时,需要使用输入/输出流来读取或写入文件。例如,`java.io.FileInputStream`和`java.io.FileOutputStream`用于读写本地文件,而`java.io.InputStream`和`java.io.OutputStream`则常用于网络数据传输。 - **多部分表单数据解析**:对于文件上传,Java需要解析多部分表单数据,可以使用Apache Commons FileUpload库或者Java 7引入的`Part`接口来处理。 2. **Ajax异步通信**: - **XMLHttpRequest对象**:Ajax的核心是XMLHttpRequest对象,它允许JavaScript在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容。 - **jQuery/Ajax库**:虽然现在更常见的是使用现代前端框架如Vue或React,但在旧项目中,jQuery经常用于简化Ajax调用。通过`$.ajax()`或`$.get()`、`$.post()`等方法,可以实现与后端的异步通信。 - **JSON数据交换**:前后端之间通常使用JSON格式进行数据交换,因为它是轻量级且易于解析的。 3. **进度条展示**: - **前端进度条组件**:可以使用HTML5的`<progress>`元素,或者第三方库如jQuery UI的ProgressBar,或者现代框架如Vue的组件来创建进度条。 - **实时更新进度**:通过Ajax的`onprogress`事件,可以在文件传输过程中获取到已传输的数据量,然后根据这个信息更新前端的进度条。 4. **安全性与优化**: - **文件大小限制**:为了防止大文件导致服务器崩溃,通常需要设置文件大小限制。 - **错误处理**:确保有适当的错误处理机制,例如在网络中断或文件上传失败时,能够通知用户并进行适当的操作。 - **多线程处理**:对于大文件,可能需要采用多线程技术来提高上传或下载速度。 这个"带进度条的java上传下载源码"可能涵盖了Java Servlet的文件操作、Ajax异步通信以及前端进度条的实现,是一个完整的前后端交互示例。通过学习和理解这个源码,开发者可以掌握如何在Java Web应用中实现实时反馈的文件上传和下载功能。











































































































































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- wxf201011272012-07-09还不错,直接不熟到服务器上就能看见效果了···
- qs_252014-10-30特别好。。。

- 粉丝: 5
- 资源: 28
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- HCIP作业1 这里面是完成的ensp的拓扑图
- 9月最新H5爆点火箭源码竞猜区块链修复推广完美+免公众号接口+防风+完整搭建视频
- DC靶场系列-DC1靶场-渗透测试靶场
- WordPress插件微信公众号涨粉插件
- linux下 jq 截取json文件信息
- 2001-2023年 中国证券期货统计年鉴.zip
- 价值29800元最新商业版陪玩3.0独立版本系统最新公众号h5版源码
- linux下 jq 截取json文件信息
- DeepSeek入门宝典系列.zip
- HTML+CSS学习笔记.pdf
- 簡易瀏覽器python
- HTML+CSS+JavaScript学习笔记.pdf
- [AB PLC例程源码][MMS_042504]Logix5000 interface to Atlas-Copco Tool Controller over EtherNet-IP.zip
- [AB PLC例程源码][MMS_042497]Using Phase Manager to Build a Scalable Batching Solution.zip
- [AB PLC例程源码][MMS_043071]Phase Manager and a Scalable Batching Solution.zip
- [AB PLC例程源码][MMS_039839]Copying a DINT variable to Ebool array, Count n.zip


