webuploader断点续传(用java向hdfs上传文件时,如何实现断点续传)

:暂无数据 2026-10-05 17:00:06 :2

webuploader断点续传(用java向hdfs上传文件时,如何实现断点续传)

今天给各位分享用java向hdfs上传文件时,如何实现断点续传的知识,其中也会对用java向hdfs上传文件时,如何实现断点续传进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

用java向hdfs上传文件时,如何实现断点续传

@Component("javaLargeFileUploaderServlet")
@WebServlet(name = "javaLargeFileUploaderServlet", urlPatterns = { "/javaLargeFileUploaderServlet" })
public class UploadServlet extends HttpRequestHandlerServlet
implements HttpRequestHandler {

private static final Logger log = LoggerFactory.getLogger(UploadServlet.class);

@Autowired
UploadProcessor uploadProcessor;

@Autowired
FileUploaderHelper fileUploaderHelper;

@Autowired
ExceptionCodeMappingHelper exceptionCodeMappingHelper;

@Autowired
Authorizer authorizer;

@Autowired
StaticStateIdentifierManager staticStateIdentifierManager;
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws IOException {
log.trace("Handling request");

Serializable jsonObject = null;
try {
// extract the action from the request
UploadServletAction actionByParameterName =
UploadServletAction.valueOf(fileUploaderHelper.getParameterValue(request, UploadServletParameter.action));

// check authorization
checkAuthorization(request, actionByParameterName);

// then process the asked action
jsonObject = processAction(actionByParameterName, request);
// if something has to be written to the response
if (jsonObject != null) {
fileUploaderHelper.writeToResponse(jsonObject, response);
}

}
// If exception, write it
catch (Exception e) {
exceptionCodeMappingHelper.processException(e, response);
}

}
private void checkAuthorization(HttpServletRequest request, UploadServletAction actionByParameterName)
throws MissingParameterException, AuthorizationException {

// check authorization
// if its not get progress (because we do not really care about authorization for get
// progress and it uses an array of file ids)
if (!actionByParameterName.equals(UploadServletAction.getProgress)) {

// extract uuid
final String fileIdFieldValue = fileUploaderHelper.getParameterValue(request, UploadServletParameter.fileId, false);

// if this is init, the identifier is the one in parameter
UUID clientOrJobId;
String parameter = fileUploaderHelper.getParameterValue(request, UploadServletParameter.clientId, false);
if (actionByParameterName.equals(UploadServletAction.getConfig) && parameter != null) {
clientOrJobId = UUID.fromString(parameter);
}
// if not, get it from manager
else {
clientOrJobId = staticStateIdentifierManager.getIdentifier();
}
// call authorizer
authorizer.getAuthorization(
request,
actionByParameterName,
clientOrJobId,
fileIdFieldValue != null ? getFileIdsFromString(fileIdFieldValue).toArray(new UUID {}) : null);

}
}
private Serializable processAction(UploadServletAction actionByParameterName, HttpServletRequest request)
throws Exception {
log.debug("Processing action " + actionByParameterName.name());

Serializable returnObject = null;
switch (actionByParameterName) {
case getConfig:
String parameterValue = fileUploaderHelper.getParameterValue(request, UploadServletParameter.clientId, false);
returnObject =
uploadProcessor.getConfig(
parameterValue != null ? UUID.fromString(parameterValue) : null);
break;
case verifyCrcOfUncheckedPart:
returnObject = verifyCrcOfUncheckedPart(request);
break;
case prepareUpload:
returnObject = prepareUpload(request);
break;
case clearFile:
uploadProcessor.clearFile(UUID.fromString(fileUploaderHelper.getParameterValue(request, UploadServletParameter.fileId)));
break;
case clearAll:
uploadProcessor.clearAll();
break;
case pauseFile:
List《UUID》 uuids = getFileIdsFromString(fileUploaderHelper.getParameterValue(request, UploadServletParameter.fileId));
uploadProcessor.pauseFile(uuids);
break;
case resumeFile:
returnObject =
uploadProcessor.resumeFile(UUID.fromString(fileUploaderHelper.getParameterValue(request, UploadServletParameter.fileId)));
break;
case setRate:
uploadProcessor.setUploadRate(UUID.fromString(fileUploaderHelper.getParameterValue(request, UploadServletParameter.fileId)),
Long.valueOf(fileUploaderHelper.getParameterValue(request, UploadServletParameter.rate)));
break;
case getProgress:
returnObject = getProgress(request);
break;
}
return returnObject;
}
List《UUID》 getFileIdsFromString(String fileIds) {
String splittedFileIds = fileIds.split(",");
List《UUID》 uuids = Lists.newArrayList();
for (int i = 0; i 《 splittedFileIds.length; i++) {
uuids.add(UUID.fromString(splittedFileIds));
}
return uuids;
}
private Serializable getProgress(HttpServletRequest request)
throws MissingParameterException {
Serializable returnObject;
String ids =
new Gson()
.fromJson(fileUploaderHelper.getParameterValue(request, UploadServletParameter.fileId), String.class);
Collection《UUID》 uuids = Collections2.transform(Arrays.asList(ids), new Function《String, UUID》() {

@Override
public UUID apply(String input) {
return UUID.fromString(input);
}

});
returnObject = Maps.newHashMap();
for (UUID fileId : uuids) {
try {
ProgressJson progress = uploadProcessor.getProgress(fileId);
((HashMap《String, ProgressJson》) returnObject).put(fileId.toString(), progress);
}
catch (FileNotFoundException e) {
log.debug("No progress will be retrieved for " + fileId + " because " + e.getMessage());
}
}
return returnObject;
}
private Serializable prepareUpload(HttpServletRequest request)
throws MissingParameterException, IOException {

// extract file information
PrepareUploadJson fromJson =
new Gson()
.fromJson(fileUploaderHelper.getParameterValue(request, UploadServletParameter.newFiles), PrepareUploadJson.class);

// prepare them
final HashMap《String, UUID》 prepareUpload = uploadProcessor.prepareUpload(fromJson);

// return them
return Maps.newHashMap(Maps.transformValues(prepareUpload, new Function《UUID, String》() {

public String apply(UUID input) {
return input.toString();
};
}));
}
private Boolean verifyCrcOfUncheckedPart(HttpServletRequest request)
throws IOException, MissingParameterException, FileCorruptedException, FileStillProcessingException {
UUID fileId = UUID.fromString(fileUploaderHelper.getParameterValue(request, UploadServletParameter.fileId));
try {
uploadProcessor.verifyCrcOfUncheckedPart(fileId,
fileUploaderHelper.getParameterValue(request, UploadServletParameter.crc));
}
catch (InvalidCrcException e) {
// no need to log this exception, a fallback behaviour is defined in the
// throwing method.
// but we need to return something!
return Boolean.FALSE;
}
return Boolean.TRUE;
}
}

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:

 view plain copy

  • 《%@ page contentType="text/html;charset=UTF-8" language="java" %》  

  • 《%@taglib prefix="s" uri="/struts-tags" %》  

  • 《html》  

  • 《head》《title》Image 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:

     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配置文件:

     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类型的对象,并且指向上传的文件,代码如下,红色部分表示变化:

     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;  

  • }  

  • }  

  • 配置文件为,红色为变化部分:

     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。例如:

     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    文件类型不在上传文件允许类型中的错误提示    

webuploader 怎么实现多文件上传

和普通的上传请求一样,你可以使用commons-upload来解析请求,spring的话可以通过action的注解参数来获取上传的文件,jfinal可以用getFile()方法来获取。
如果你想简单,可以以字节流的形式发送文件,webuploder有个参数sendAsBinary ,将其设置为true,这样你java后端用request.getInputStream()即可获取文件的字节流,文件名等参数你可以通过request.getParameter()方法获得。推荐你这么做,最简单的方式。

求jsp文件分片上传,断点续传的方法

无组件断点续传.gif
1. 组件简介
webuploader:是一个以HTML5为主, Flash为辅的文件上传组件,采用大文件分片/并发上传的方式,极大地提高了文件上传的效率,同时兼容多种浏览器版本;
2. 项目背景简介
本篇文章的背景,是在上一篇文章(《无组件实现大文件分片上传,断点续传》)的项目背景下进行的一次尝试,所以本篇文章还是基于上一篇文章的背景,但是不会介绍视频基本信息(视频标题、简介、播出时间等)的操作,主要介绍文件的上传。因为项目的特殊需求,这种使用插进的方式最终没有被采用,因为一些控件无法做到定制化。
上一篇文章(《无组件实现大文件分片上传,断点续传》)中介绍的文件上传方式,在前端主要采用纯JavaScript来进行文件切分、验证,后台主要采用了NIO的方式进行分片的追加。而在这篇文章中,将介绍前端采用webuploader,后台采用临时目录+传统I/O方式进行分片合并的方式。
3. 技术实现
3.1 组件引入
在webuploader官网下载必要的文件,放入项目中。在页面中进行引入;
0_组件引入.png
《!-- webuploader文件上传 --》
《script src="static/webuploader/webuploader.nolog.min.js"》《/script》
《link href="static/webuploader/webuploader.css" rel="stylesheet" type="text/css" /》
3.2 前端页面实现
在前端页面中,可以不用关心css样式,但需要注意标签的id/nama属性,这些将在后面的JavaScript中使用到。

Web Uploader + php视频分片上传

由于最近项目中遇到有做视频上传的功能,决定写一篇文章详细说明大文件上传的原理和使用Baidu WebFE(FEX)团队开发的文件上传插件WebUploader。

利用前端框架WebUploader配置进行对大文件的分片(由Baidu官方测试,每5M一个分片是效率最高的),这里,我的服务端是php,所以需要修改php.ini里面的post_max_size配置,默认是2M,我这里改的是8M。

服务端php接收分片,WebUploader插件会提供一个GUID,可以利用GUID加任意个性化信息做分片名(当然,分片序号需要加上),当所有分片上传完毕后,调用合并请求,对分片进行合并即可。

上传前,我会计算整个文件的MD5值到我们的资源库去查找是否已有相同资源,如果有的话,直接文件共享即可。
首先,我们需要创建对应的文件夹
其实服务端做的事情相对比较简单了,每上传的分片写到一个文件里去,最后把分片按照序号合并起来即可。
用户上传大文件的时候或多或少会有中断,断网的情况,这个时候服务器就会出现多的分片碎片,这个完全占用服务器存储空间的,所以我们需要对这些所谓的垃圾文件做处理,我们可以设置碎片文件的过期时间,如果超过时间还存在的话,进行删除,或者当天删除前一天的分片文件夹也是可以的,这样相对来说比较省事。

关于webuploader断点续传和用java向hdfs上传文件时,如何实现断点续传的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

webuploader断点续传(用java向hdfs上传文件时,如何实现断点续传)

本文编辑:admin

更多文章:


idea控制台乱码(idea 输出 System.out.println() 控制台乱码)

idea控制台乱码(idea 输出 System.out.println() 控制台乱码)

各位老铁们,大家好,今天由我来为大家分享idea控制台乱码,以及idea 输出 System.out.println() 控制台乱码的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大

2026年10月14日 07:30

抹茶冰皮月饼(冰皮月饼的做法)

抹茶冰皮月饼(冰皮月饼的做法)

大家好,抹茶冰皮月饼相信很多的网友都不是很明白,包括冰皮月饼的做法也是一样,不过没有关系,接下来就来为大家分享关于抹茶冰皮月饼和冰皮月饼的做法的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

2026年10月14日 06:20

spring事务的作用(为什么要使用spring的事务,一般在什么情况下使用)

spring事务的作用(为什么要使用spring的事务,一般在什么情况下使用)

“spring事务的作用”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看spring事务的作用(为什么要使用spring的事务,一般在什么情况下使用)!

2026年10月14日 05:40

网站开发项目计划书(网站建设项目策划书)

网站开发项目计划书(网站建设项目策划书)

大家好,关于网站开发项目计划书很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于网站建设项目策划书的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2026年10月14日 04:50

linux怎么进入命令行(怎么样配置linux使其启动时直接登录到命令行模式)

linux怎么进入命令行(怎么样配置linux使其启动时直接登录到命令行模式)

大家好,关于linux怎么进入命令行很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于怎么样配置linux使其启动时直接登录到命令行模式的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦

2026年10月14日 02:00

java培训机构好还是大学好(大学生想转行学java,该去java培训班还是自学呢)

java培训机构好还是大学好(大学生想转行学java,该去java培训班还是自学呢)

其实java培训机构好还是大学好的问题并不复杂,但是又很多的朋友都不太了解大学生想转行学java,该去java培训班还是自学呢,因此呢,今天小编就来为大家分享java培训机构好还是大学好的一些知识,希望可以帮助到大家,下面我们一起来看看这个

2026年10月13日 23:30

各种花边图案(花边怎么画 简单易学的花边绘画教程)

各种花边图案(花边怎么画 简单易学的花边绘画教程)

各位老铁们,大家好,今天由我来为大家分享各种花边图案,以及花边怎么画 简单易学的花边绘画教程的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年10月13日 19:10

stewardess读音(空姐的英文读音)

stewardess读音(空姐的英文读音)

本篇文章给大家谈谈stewardess读音,以及空姐的英文读音对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月13日 19:00

前端面试必背十个点(资深HR揭秘:Web前端面试技巧有哪些)

前端面试必背十个点(资深HR揭秘:Web前端面试技巧有哪些)

“前端面试必背十个点”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看前端面试必背十个点(资深HR揭秘:Web前端面试技巧有哪些)!

2026年10月13日 17:50

sqlplus重置用户名密码(Oracle中的plus的用户名和密码忘了怎么办)

sqlplus重置用户名密码(Oracle中的plus的用户名和密码忘了怎么办)

大家好,关于sqlplus重置用户名密码很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Oracle中的plus的用户名和密码忘了怎么办的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站

2026年10月13日 17:40

最近更新

巫溪做网站建设需要哪些资料?
2026-10-14 10:26:18 浏览:0
永春百度seo新站如何快速收录
2026-10-14 10:22:14 浏览:0
热门文章

sql server2008下载地址(如何下载SQL Server 2008 R2 SP2免费版)
2026-10-05 05:30:29 浏览:6
thinkpadx100eu盘启动(thinkpad x100e U盘启动 支持的写入方式是什么)
2026-09-01 14:20:01 浏览:6
标签列表