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

author author     2023-04-28     375

关键词:

如题,在向hdfs上传文件时,如果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[i]));

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;

追问

我觉得你在逗我,你觉得呢

参考技术A 我是做任务的不用管我

4gb以上,超大文件上传,http断点续传,如何实现?(代码片段)

...要支持高性能的大文件(大都数是4GB以上)的http上传,并且要求支持http断点续传。笔者在以前介绍了实现大文件上传的一些基本概念,其实非常简单,这里在简要归纳一下,方便记忆!服务器端由C语... 查看详情

java如何实现大文件分片上传,断点续传和秒传

Java如何实现大文件分片上传,断点续传和秒传引言概念秒传1、什么是秒传2、实现秒传常见做法分片上传1、什么是分片上传2、分片上传的场景断点续传1、什么是断点续传2、应用场景3、实现断点续传的核心逻辑实现思路前置知识... 查看详情

javasocket如何实现文件的断点续传,有代码更好

参考技术A上传:上传时附带一个描述数据起始位置的参数。接受的一端接收到数据后,按照起始位置续写文件。下载:按照本地已保存的大小,提交下载请求。服务器按照请求的位置,传数据。大概就是这么个意思。还要处理很多... 查看详情

java实现文件的断点续传

​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。第一步:前端修改由于项目使用的是BJUI前端框架,并... 查看详情

springboot实现分片上传断点续传大文件极速秒传-备忘(代码片段)

  文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传... 查看详情

如何实现html5文件断点续传

...;新增了"multiple"属性,该属性可接受多个值的文件上传字段<inputtype="file"multiple="multiple"name="file"id="file">添加了该属性用户就可以在弹出的对话框中一次性选择多个文件了二、实现文件从... 查看详情

利用java实现断点上传

1.用什么流传2.客户端如何获得上传速度和上传百分比1、Java中用于进行流操作都是java.lang.io包下,如果借助于网络则用Socket。2、获取上传速度可以根据时间量和上传的量得出。至于断点得记录上次已上传的量。参考技术A我以前... 查看详情

html超大文件上传和断点续传的实现

需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:前端修改由于项目使用的是BJUI前端框架,... 查看详情

基于http的文件断点续传实现(代码片段)

...现1:断点续传的介绍客户端软件断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以... 查看详情

java实现文件的断点续传

java实现文件的断点续传:依赖:<!--文件上传--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.2.1</version></dep 查看详情

面试官:请你实现一个大文件上传和断点续传(代码片段)

...一段时间整理了下思路,那么究竟该如何实现一个大文件上传,以及在上传中如何实现断点续传的功能呢?本文将从零搭建前端和服务端,实现一个大文件上传和断点续 查看详情

b/s之大文件分段上传断点续传

4GB以上超大文件上传和断点续传服务器的实现随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。但是在很多情况下,平台运营方并没有大文件上传和断点续... 查看详情

文件上传控件-如何上传文件-文件夹断点续传

最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表格数据、... 查看详情

求php以上超大文件上传和断点续传服务器的实现

php以上超大文件上传和断点续传服务器的实现现在这个时代文件存储基本分离到了单独的存储服务上面,比如说阿里云的OSS,七牛云的云存储等等.考虑这些第三方服务的话,那么你的大文件上传和断点续传等功能实现只需要去对接... 查看详情

java文件上传下载用哪种技术好?

我需要做课件上传,一、上传的内容会比较大,二、要支持断点续传及自动尝试重练(设定次数内),三、需要支持一次上传多个文件;四、上传需要有进度条显示给用户;五、支持单线程或多线程文件上传(可配置);六、上... 查看详情

javaweb断点续传,我用的是fileupload来做的上传。

现在上传和进度条已经实现的,就是断点续传和。和断点进度条要如何实现我一点头绪也没有,求高手指点!!!我用的上传jar是Commons-fileupload和Commons-ioform提交的<inputtype="file">数据在后台要如何获取上传文件的名字... 查看详情

vuehttp大文件断点续传上传

javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="$pageCo... 查看详情

超大文件上传和断点续传的组件

...才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:  查看详情