java断点续传,java断点续传原理

本文目录一览:

浏览器的断点续传用java怎么实现

断点设置方法,当有临时文件时,直接在临时文件中读取上次中断时的断点位置。没有临时文件,即第一次时,重新设置断点。

rantmpfile.seek()跳转到一个位置的目的是为了让各个断点存储的位置尽量分开。

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断点续传

024字节)。第一次B接收了512字节,那么第二次连接A就应该从513字节开始传输。

也就是说,在第二次传输时,B要提供“我要从513字节开始传送文件F”的信息,然后A使用FileInputStream构建输入流读取本地文件,使用skip(512)方法跳过文件F的前512字节再传送文件,之后B将数据追加(append)到先前接收的文件末尾即可。

进一步考虑,如果要实现多线程传送,即分块传输,也同样的道理。假如B要求分作两块同时传输,那么A启动两个线程,一个从513字节读到768字节(工256字节),第二个线程从769字节到1024字节即可。

如果你要从网络上下载文件,就是说A方不是你实现的,那么你要先确认A方支不支持断电续传功能(HTTP1.1),然后你查阅下HTTP1.1协议,在HTTP1.1版本里,可以通过设置请求包头某个字段的信息(使用URLConnection创建连接并使用setRequestProperty(String key, String value) 方法设置)从而精确读取文件的某一段数据的。注意,基于HTTP断点续传的关键是1.1版本,1.0版本是不支持的。

补充:

嗯,查到了,是设置range属性,即setRequestProperty(“range”, “bytes=513-1024”).你可以使用迅雷下载某个文件,然后从”线程信息“中就可以看到这个http1.1断点续传的所有行为信息了。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/295146.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-26 17:15
下一篇 2024-12-26 17:15

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29

发表回复

登录后才能评论