本文目錄一覽:
瀏覽器的斷點續傳用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/zh-hant/n/295146.html