溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

AJAX+JSF組件實現(xiàn)高性能的文件上載(2)

發(fā)布時間:2020-08-07 01:39:37 來源:ITPUB博客 閱讀:131 作者:lonlux2 欄目:編程語言

AJAX+JSF組件實現(xiàn)高性能的文件上載(2)

[@more@]三) ProgressMonitorFileItemFactory類

public class ProgressMonitorFileItemFactory extends DiskFileItemFactory {

 private File temporaryDirectory;

 private HttpServletRequest requestRef;

 private long requestLength;

 public ProgressMonitorFileItemFactory(HttpServletRequest request) {

super();

temporaryDirectory = (File)request.getSession().

getServletContext().getAttribute("javax.servlet.context.tempdir");

requestRef = request;

String contentLength = request.getHeader("content-length");

if(contentLength != null){requestLength

= Long.parseLong(contentLength.trim());}

 }

 public FileItem createItem(String fieldName,

String contentType,boolean isFormField, String fileName) {

SessionUpdatingProgressObserver observer = null;

if(isFormField == false) //這必須是一文件上傳.

 observer = new SessionUpdatingProgressObserver(fieldName,fileName);

 ProgressMonitorFileItem item = new ProgressMonitorFileItem(

 fieldName,contentType,isFormField,

 fileName,2048,temporaryDirectory,

 observer,requestLength);

return item;

 }

 ...

 public class SessionUpdatingProgressObserver implements ProgressObserver {

private String fieldName;

private String fileName;

...

public void setProgress(double progress) {

 if(request != null){

request.getSession().setAttribute(

"FileUpload.Progress."+fieldName,progress);

request.getSession().setAttribute(

"FileUpload.FileName."+fieldName,fileName);

 }

}

 }

}

ProgressMonitorFileItemFactory Content-Length頭由瀏覽器設(shè)置并且假定它是被設(shè)置的上傳文件的精確長度。這種確定文件長度的方法確實限制了你在每次請求中上傳的文件-如果有多個文件在該請求中被編碼的話,不過這個值是不精確的。這是由于,瀏覽器僅僅發(fā)送一個Content-Length頭,而不考慮上傳的文件數(shù)目。

除了創(chuàng)建ProgressMonitorFileItem實例之外,ProgressMonitorFileItemFactory還注冊了一個ProgressObserver實例,它將由ProgressMonitorFileItem來發(fā)送文件上傳過程中的更新。我們所使用的ProgressObserver的實現(xiàn)(SessionUpdatingProgressObserver)針對被提交字段的id把進(jìn)度百分?jǐn)?shù)設(shè)置到用戶的會話中。然后,這個值可以由JSF組件存取以便把更新發(fā)送給用戶。

(四) ProgressMonitorFileItem類

public class ProgressMonitorFileItem extends DiskFileItem {

 private ProgressObserver observer;

 private long passedInFileSize;

 ...

 private boolean isFormField;

 ...

 @Override

 public OutputStream getOutputStream() throws IOException {

OutputStream baseOutputStream = super.getOutputStream();

if(isFormField == false){

 return new BytesCountingOutputStream(baseOutputStream);

}else{return baseOutputStream;}

 }

 ...

 private class BytesCountingOutputStream extends OutputStream{

private long previousProgressUpdate;

private OutputStream base;

public BytesCountingOutputStream(OutputStream ous){ base = ous; }

...

private void fireProgressEvent(int b){

 bytesRead += b;

 ...

 double progress = (((double)(bytesRead)) / passedInFileSize);

 progress *= 100.0

 observer.setProgress();

}

 }

}

ProgressMonitorFileItem把DiskFileItem的缺省OutputStream包裝到一個BytesCountingOutputStream中,這可以在每次讀取一定數(shù)目的字節(jié)后更新相關(guān)的ProgressObserver。

(五) 支持AJAX的JavaServer Faces(JSF)上傳組件

這個組件負(fù)責(zé)生成HTML文件上傳標(biāo)簽,顯示一個進(jìn)度條以監(jiān)視文件上傳,并且生成一旦文件上傳成功需要被顯示的組件。使用JavaServer Faces實現(xiàn)這個組件的一個主要優(yōu)點是,大多數(shù)復(fù)雜性被隱藏起來。開發(fā)人員只需要把組件標(biāo)簽添加到JSP,而后由組件負(fù)責(zé)所有的AJAX及相關(guān)的進(jìn)度條監(jiān)控細(xì)節(jié)問題。下面的JSP代碼片斷用于把上傳組件添加到頁面上。

<comp:fileUpload

 value="#{uploadPageBean.uploadedFile}"

 uploadIcon="images/upload.png"

 styleClass="progressBarDiv"

 progressBarStyleClass="progressBar"

 cellStyleClass="progressBarCell"

 activeStyleClass="progressBarActiveCell">

<%--下面是一旦文件上傳完成將成為可見的組件--%>

<h:panelGrid columns="2" cellpadding="2" cellspacing="0" width="100%">

<f:facet name="header">

<h:outputText styleClass="text"

value="文件上傳成功." />

</f:facet>

<h:panelGroup >

<h:commandButton action="#{uploadPageBean.reset}"

image="images/reset.png"/>

</h:panelGroup>

<h:panelGroup >

<h:commandButton action="#{uploadPageBean.nextPage}"

image="images/continue.png"/>

</h:panelGroup>

</h:panelGrid>

</comp:fileUpload>

 文件上傳組件的value屬性需要用一個擁有一個FileItem的屬性綁定到一個bean上。組件只有在該文件被服務(wù)器成功收到時才顯示。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI