当前idle状态!捣腾了一个文件上传功能,小温故了一把java/servlet上传的原理。
上传代码未用struts2,读取进度时才用了一下,本身struts2也把下面2个开源包'集成'进去了!代码都是在网上cp的,自己拼凑,加了一些注释。
当然,如果页面上没有Form表单(甚至是也未用struts2框架),就无法以表单(mutilpart/form-data格式)提交到后台,这时候可以借用第三方控件,如:flash插件或 (c++ ocx)控件等,辅助模仿form表单提交到jsp页面,再用jsp接收输入流,达到上传文件的目的!
如若想详细了解servlet上传,请参见这位大神的文章:http://www.ibm.com/developerworks/cn/java/fileup/
用struts2框架上传的文章:http://blog.csdn.net/lenotang/article/details/2784843
需要的jar:commons-fileupload-x.x.x.jar 和 commons-io-x.x.x.jar
首先是前端页面代码,(extjs3.3.1)
var m =0 ;
var _interval;
Ext.onReady(function() {
var formPanel = new Ext.form.FormPanel({
labelWidth:80,
id:'formPanel',
bodyStyle:'padding:5 0 0 0 ',
height:515,
width:200,
frame:true,
fileUpload:true,
items:[new Ext.form.TextField({
id:'excelUpload',
anchor:'90%',
height:30,
width:350,
name:'file',
inputType:'file',
fieldLabel:'文件选择'
})
]
});
var upLoadFile = new Ext.Toolbar.Button({
text:'上传',
listeners:{
'click': uploadFiles
}
});
new Ext.Window({
title:'上传文件',
width:400,
height:140,
minWidth:400,
id:'uploadWin',
minHeight:140,
layout:'fit',
plain:true,
bodyStyle:'padding:5px;',
buttonAlign:'center',
items:formPanel,
buttons:[upLoadFile]
}).show();
});
function uploadFiles(t){
var excelName = Ext.getCmp('excelUpload').getRawValue();// 上传文件名称的路径
if (excelName == ""){
Ext.Msg.alert("提示","请选择需要上传的文件!");
return;
}else {
var array = new Array();
array = excelName.split("\\");
var length = array.length;
var fileName = "";
var index = 0;
for (index = 0; index < length; index++) {
if (fileName == "") {
fileName = array[index];
} else {
fileName = fileName + "/" + array[index];
}
}
_interval = setInterval("showRequest()", 100);
Ext.getCmp("formPanel").getForm().submit({
url:'servlet/fileUpload',
method:'POST',
success:function(form, action, o) {
Ext.MessageBox.alert("提示信息",action.result.message);
Ext.getCmp("uploadWin").setTitle("上传文件");
},
failure : function(form, action) {
Ext.MessageBox.alert("提示信息","请求失败,文件上传失败");
}
});
}
}
function showRequest(){
Ext.Ajax.request( {
url : 'loginAction/getUploadPrcent.action',
method : 'post',
success: function(data, options){
Ext.getCmp("uploadWin").setTitle("上传文件:已经写入("+data.responseText+")");
if(data.responseText =='100%'){
clearInterval(_interval);
Ext.getCmp("uploadWin").setTitle("上传文件:写入完成,请稍等...");
return;
}
m++ ;
}
});
}
再贴监听方法:
public class UploadProgressListener implements ProgressListener {//要继承ProgressListener
private double megaBytes = -1;
private HttpSession session;
public UploadProgressListener(HttpServletRequest request) {
session=request.getSession();
}
public void update(long pBytesRead, long pContentLength, int pItems) {
double mBytes = pBytesRead / 1000000;
double total=pContentLength/1000000;
if (megaBytes == mBytes) {
return;
}
System.out.println("total====>"+total);
System.out.println("mBytes====>"+mBytes);
megaBytes = mBytes;
System.out.println("megaBytes====>"+megaBytes);
System.out.println("We are currently reading item " + pItems);
if (pContentLength == -1) {
System.out.println("So far, " + pBytesRead + " bytes have been read.");
} else {
System.out.println("So far, " + pBytesRead + " of " + pContentLength
+ " bytes have been read.");
double read=(mBytes/total);
NumberFormat nf=NumberFormat.getPercentInstance();
System.out.println("生成读取的百分比 并放入session中===>"+nf.format(read));//生成读取的百分比 并放入session中
session.setAttribute("readPrcnt", nf.format(read));
}
}
}
再贴:上传dopost()方法:
public class fileUpload extends HttpServlet {
private static final long serialVersionUID = 1L;
public fileUpload() {
super();
}
public void destroy() {
super.destroy();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
//文件名中文乱码问题,可调用ServletUpLoader的setHeaderEncoding方法,或者设置request的setCharacterEncoding属性
boolean isMultipart = ServletFileUpload.isMultipartContent(request); //判断上传表单是否为multipart/form-data类型
if (isMultipart) {
// 创建磁盘工厂,利用构造器实现内存数据储存量和临时储存路径
DiskFileItemFactory factory=new DiskFileItemFactory();
factory.setSizeThreshold(4096);
// 设置文件临时存储路径
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
// 产生一新的文件上传处理程式
ServletFileUpload upload = new ServletFileUpload(factory);
ProgressListener progressListener = new UploadProgressListener(request);
request.getSession().setAttribute("progress", progressListener);
upload.setProgressListener(progressListener);
//文件名中文乱码问题,可调用ServletUpLoader的setHeaderEncoding方法,或者设置request的setCharacterEncoding属性
upload.setSizeMax(1024 * 1024 * 100); // 设置允许用户上传文件大小,单位:字节
FileOutputStream out = null ;
InputStream in = null;
// 得到所有的表单域,它们目前都被当作FileItem
try {
// 解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
//upload对象是使用DiskFileItemFactory 对象创建的ServletFileUpload对象,并设置了临时文件路径 传输文件大小等等。
List<FileItem> list = upload.parseRequest(request);
Iterator it=list.iterator();
while(it.hasNext())
{
FileItem item=(FileItem)it.next();// 每一个item就代表一个表单输出项
String filename = item.getName();
if(item.getName() != null && !item.isFormField()){
// 得到上传文件的名称,并截取
String savePath = this.getServletContext().getRealPath("/upload");//在WebRoot下面建了一个文件夹
String extensionName = filename.substring(filename.lastIndexOf(".") + 1);//获取文件后缀名
out=new FileOutputStream(savePath+"\\"+ UUID.randomUUID()+"."+extensionName);
in = item.getInputStream();
byte buffer[] = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
response.setContentType("text/html;charset=GB2312");
response.getWriter().print("{'success':true,'message':'上传成功'}");
}
item.delete();
}
}
catch (FileUploadException e) {
e.printStackTrace();
} finally{
try{
response.getWriter().close();
in.close();
out.close();
}catch(Exception ex){
System.out.println(ex);
}
}
}
}
public void init() throws ServletException {
// Put your code here
}
}
web.xml servlet配置:
<servlet>
<servlet-name>fileUpload</servlet-name>
<servlet-class>upload.fileUpload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileUpload</servlet-name>
<url-pattern>/servlet/fileUpload</url-pattern>
</servlet-mapping>
相关推荐
标题中的“Extjs+java+swf多文件上传进度条显示项目”是一个综合性的Web开发实践,涉及到前端的用户界面、后端的数据处理以及文件上传过程中进度反馈的实现。这个项目利用了Extjs库来构建用户界面,Java作为服务器端...
总结来说,"extjs java 上传文件进度条"这个主题涉及到前端与后端的交互,需要理解ExtJS组件的使用,熟悉Ajax异步上传,掌握Java服务器处理文件上传的逻辑,以及HTTP协议、JSON通信等相关知识。通过这些技术的结合,...
本文将详细解析"ExtJS4多文件上传,带进度条及管理"这一主题,涵盖其核心概念、实现方式以及相关技术。 **一、ExtJS4概述** ExtJS4是Sencha公司推出的一个前端框架,它提供了丰富的组件库和强大的数据绑定机制,...
本文将深入探讨如何在ExtJS中实现进度条的显示,这是一个在数据加载、文件上传或任何需要用户等待的任务中非常实用的功能。通过理解和应用以下知识点,你可以有效地在你的ExtJS项目中集成进度条,提升用户体验。 ##...
4. **样式和用户体验**:可以自定义表单样式和行为,如显示上传进度条、提供取消上传的选项等,提升用户体验。 总结起来,Java+ExtJS实现单文件上传涉及的主要知识点包括:Java Servlet的Multipart处理、文件流操作...
【标题】"extjs swfupload .net 多文件带进度条上传"涉及的核心技术是前端的EXTJS框架、后端的ASP.NET平台以及中间的文件上传组件SWFUpload。这种组合允许用户在Web应用中实现批量文件上传并显示上传进度,提供了...
在“ExtJS_可编辑Grid进度条”这个主题中,我们将深入探讨如何在Grid组件中实现可编辑的进度条功能,以及这一功能的实现原理和应用场景。 首先,我们要理解Grid的基本概念。Grid在ExtJS中是一个表格视图,用于展示...
标题中的“ExtJS3.4和VS2010上传文件的进度条”涉及的是一个使用ExtJS3.4版本的JavaScript库与Microsoft Visual Studio 2010(VS2010)进行文件上传,并在上传过程中显示进度条的功能。这个功能在Web应用程序中非常...
本篇将详细讲解如何利用`ExtJS`和`SwfUpload`来创建一个支持多文件上传、下载和删除,并带有进度条显示的系统。 `ExtJS`是一个基于JavaScript的UI框架,它提供了丰富的组件库和强大的数据绑定机制,可以构建出复杂...
用Ext编写的多文件上传组件,已封装。 支持多文件上传,文件下载,文件删除,
3. 客户端交互:使用JavaScript(例如ExtJS)显示进度条,并定时轮询服务器获取进度更新。 这样的设计确保了用户在等待过程中能获取实时反馈,提高了系统的可用性和用户满意度。然而,需要注意的是,由于采用的是...
ExtJS原生多文件拖动上传组件 使用时修改包路径 1.多文件上传 2.支持拖动上传 3.支持图片压缩 4.支持图片合并 5.文件排序 可扩展实时图片预览 api //初始化画板 initCanvas //上传文件窗口 uploadWindow //初始化...
【标题】"swf+Extjs+java多文件上传项目"是一个基于SwfUpload插件、ExtJS前端框架和Java后端技术实现的文件批量上传解决方案。该项目旨在提供一种高效、用户友好的文件上传体验,适用于需要处理大量文件上传需求的...
在"ExtJS带进度条的多文件上传和图片预览"这个项目中,它展示了如何利用ExtJS来实现一个高效且用户友好的文件上传功能,尤其适用于处理大量或大体积的文件。下面将详细介绍这个项目中的关键知识点。 1. **ExtJS组件...
在"ExtJs框架系列之ProgressGrid进度条"这个主题中,我们将深入探讨如何利用ExtJs框架中的特殊组件——ProgressColumn,来实现表格中显示动态进度条的功能。 ProgressColumn是Ext.ux.grid的一个扩展,它允许你在...
3. **进度条显示**:在文件上传过程中,EXTJS 提供了进度条来显示每个文件的上传进度,为用户提供实时反馈。 4. **错误处理**:如果某个文件上传失败,`MultiFileUploadField` 可以提供相应的错误提示,帮助用户...
在实际应用中,还需要考虑一些其他因素,如进度条显示、错误处理、文件类型限制、文件大小限制等。EXTJS提供了丰富的API和配置选项来支持这些功能。例如,可以通过监听FileField的`change`事件来实时更新文件列表,...
2. **使用Plupload**:Plupload是一个跨浏览器的文件上传工具,支持多文件上传、队列管理、进度条显示、断点续传等功能。将其与ExtJS结合,可以增强文件上传体验。集成步骤包括创建Plupload实例,配置参数如URL、...
ExtJS 验证上传文件类型 ExtJS 中实现文件上传功能是非常方便的,但对于新手来说,控制文件上传类型是一个难题。例如,我们只想让用户上传特定的文件类型,例如txt文件,那么如何实现当用户上传非txt文件时,给出...
这里提到的"jquery/extjs智能提示所需文件spket.7z"是一个压缩包,包含了帮助开发者在编写代码时实现智能提示功能的工具——Spket的配置和资源文件。 Spket是一款强大的JavaScript IDE插件,支持包括jQuery和ExtJS...