JAVA文件上传进度条(java文件上传进度条 spring)
java web断点续传,我用的是fileupload来做的上传。
使用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:
[html]?view plain?copy
%@?page?contentType="text/html;charset=UTF-8"?language="java"?%
%@taglib?prefix="s"?uri="/struts-tags"?%
html
headtitleImage?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:
[html]?view plain?copy
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配置文件:
[html]?view plain?copy
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类型的对象,并且指向上传的文件,代码如下,红色部分表示变化:
[html]?view plain?copy
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;
}
}
配置文件为,红色为变化部分:
[html]?view plain?copy
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。例如:
[html]?view plain?copy
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 ? ?文件类型不在上传文件允许类型中的错误提示 ?
请教Java怎样实现跨服务器文件上传
你好!
另一台机器也要有处理文件上传的WEB程序,你可以参考Stream上传插件(支持HTML5和Flash两种方式上传)
Stream 上传插件
Stream 是解决不同浏览器上传文件的插件,是Uploadify的Flash版和Html5版的结合!
Stream 简介
Stream 是根据某网的文件上传插件加工而来,支持不同平台(Windows, Linux, Mac, Android, iOS)下,主流浏览器(IE7+, Chrome, Firefox, Safari, 其他)的上传工作,当然在Html5标准下,还支持文件的断点续传功能,有效解决大文件的Web上传问题!
主要特征
1. 源码完全开放,目前有Java、PHP、Perl三种后台语言实现
2. 支持HTML5、Flash两种方式(跨域)上传
3. 多文件一起上传
4. HTML5支持断点续传,拖拽等新特性
5. 兼容性好IE7+, FF3.6+, Chrome*,Safari4+,遨游等主流浏览器
6. 进度条、速度、剩余时间等附属信息
7. `选择文件的按钮`可以自定义
8. 简单的参数配置实现 灵活多变的功能
9. 支持文件夹上传(Chrome21+, Opera15+)
10. 支持自定义UI(V1.4+)
指定跨域上传就可以了
这些都是小鸟云的工程师告诉我的,建议你可以试试小鸟云
G.ho.st网盘,如何使用JAVA批量上传文件?
很简单。在左边一栏,用鼠标点击你要上传的文件夹,按住鼠标左键不放,拖动文件夹到右边一栏,也就是网盘一栏指定位置,电脑就自动就开始上传了。我就是用这种方法上传文件的。
java web 服务器端执行的进度条
开始页面:start.jsp
%@ page contentType="text/html; charset=GBK" %
% session.removeAttribute("task"); %
jsp:useBean id="task" scope="session" class="progress.TaskBean"/
% task.setRunning(true); %
% new Thread(task).start(); %
jsp:forward page="status.jsp"/
状态页面:status.jsp
%@ page contentType="text/html; charset=GBK" %
jsp:useBean id="task" scope="session" class="progress.TaskBean"/
HTML
HEAD
TITLEJSP进度条/TITLE
% if (task.isRunning()) { %
script type="" LANGUAGE="JavaScript"
setTimeout("location='status.jsp'", 1000);
/script
% } %
/HEAD
bODY bgcolor=""
H1 ALIGN="CENTER"JSP进度条/H1
H2 ALIGN="CENTER"
结果: %= task.getResult() %BR
% int percent = task.getPercent(); %
%= percent %%
/H2
TABLE WIDTH="60%" ALIGN="CENTER"
CELLPADDING=0 CELLSPACING=2
TR
% for (int i = 10; i = percent; i += 10) { %
TD WIDTH="10%" height="10" BGCOLOR="red" /TD
% } %
% for (int i = 100; i percent; i -= 10) { %
TD WIDTH="10%" /TD
% } %
/TR
/TABLE
TABLE WIDTH="100%" BORDER=0 CELLPADDING=0 CELLSPACING=0
TR
TD ALIGN="CENTER"
% if (task.isRunning()) { %
正在执行
% } else { %
% if (task.isCompleted()) { %
完成
% } else if (!task.isStarted()) { %
尚未开始
% } else { %
已停止
% } %
% } %
/TD
/TR
TR
TD ALIGN="CENTER"
BR
% if (task.isRunning()) { %
FORM METHOD="GET" ACTION="stop.jsp"
INPUT TYPE="SUBMIT" ="停止"
/FORM
% } else { %
FORM METHOD="GET" ACTION="start.jsp"
INPUT TYPE="SUBMIT" ="开始"
/FORM
% } %
/TD
/TR
/TABLE
/BODY/HTML
停止页面:stop.jsp
%@ page contentType="text/html; charset=GBK" %
jsp:useBean id="task" scope="session" class="progress.TaskBean"/
% task.setRunning(false); %
jsp:forward page="status.jsp"/
业务逻辑bean:TaskBean.java
package progress;
import java.io.Serializable;
public class TaskBean
implements Runnable, Serializable {
private int counter;
private int sum;
private boolean started;
private boolean running;
private int sleep;
public TaskBean() {
counter = 0;
sum = 0;
started = false;
running = false;
sleep = 100;
}
protected void work() {
try {
Thread.sleep(sleep);
counter++;
sum += counter;
}
catch (InterruptedException e) {
setRunning(false);
}
}
public synchronized int getPercent() {
return counter;
}
public synchronized boolean isStarted() {
return started;
}
public synchronized boolean isCompleted() {
return counter == 100;
}
public synchronized boolean isRunning() {
return running;
}
public synchronized void setRunning(boolean running) {
this.running = running;
if (running) {
started = true;
}
}
public synchronized Object getResult() {
if (isCompleted()) {
return new Integer(sum);
}
else {
return null;
}
}
public void run() {
try {
setRunning(true);
while (isRunning() !isCompleted()) {
work();
}
}
finally {
setRunning(false);
}
}
}