版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 1. 引言</b></p><p> 基于瀏覽器的文件上傳,特別是對(duì)于通過<input type="file">標(biāo)簽來實(shí)現(xiàn)上傳的情況, 存在著嚴(yán)重的性能問題,因?yàn)橛脩籼峤涣宋募螅跒g覽器把文件上傳到服務(wù)器的過程中,界面看上去似乎是靜止的,如果是小文件還好些,如果不幸需要上傳的是幾兆、幾十兆甚至上百兆的文件,我相信那
2、是一種非常痛苦的體驗(yàn),我們中間的很多人應(yīng)該都有過此種不堪的經(jīng)歷。(一笑)</p><p> 現(xiàn)在我就針對(duì)這個(gè)問題給出一個(gè)解決方案,我們將實(shí)現(xiàn)一個(gè)具有監(jiān)控能力的WEB上傳的程序——它不僅把文件上傳到服務(wù)器,而且"實(shí)時(shí)地"監(jiān)視文件上傳的實(shí)際過程。</p><p> 解決方案的基本思路是這樣的: </p><p> 在Form提交上傳文件同時(shí),使
3、用AJAX周期性地從Servlet輪詢上傳狀態(tài)信息 </p><p> 然后,根據(jù)此信息更新進(jìn)度條和相關(guān)文字,及時(shí)反映文件傳輸狀態(tài) </p><p> 如果用戶取消上傳操作,則進(jìn)行相應(yīng)的現(xiàn)場(chǎng)清理工作:刪除已經(jīng)上傳的文件,在Form提交頁(yè)面中顯示相關(guān)信息 </p><p> 如果上傳完畢,顯示已經(jīng)上傳的文件內(nèi)容(或鏈接) </p><p>
4、; 在介紹源代碼之前,我們先來看看程序運(yùn)行界面:</p><p><b> 2. 實(shí)現(xiàn)代碼</b></p><p> 實(shí)現(xiàn)代碼想當(dāng)然的有服務(wù)器端代碼和客戶端代碼(呵呵),我們先從服務(wù)器端開始。</p><p> 2.1. 服務(wù)器端代碼</p><p> 2.1.1. 文件上傳狀
5、態(tài)類(FileUploadStatus)</p><p> 使用FileUploadStatus這個(gè)類記錄文件上傳狀態(tài),并將其作為服務(wù)器端與web客戶端之間通信的媒介,通過對(duì)這個(gè)類對(duì)象提供上傳狀態(tài)作為服務(wù)器回應(yīng)發(fā)送給web客戶端, web客戶端使用JavaScript獲得文件上傳狀態(tài)。源代碼如下:</p><p><b> /**</b></p>&
6、lt;p> * 本例程演示了通過Web上傳文件過程中的進(jìn)度顯示。您可以對(duì)本例程進(jìn)行任何修改和使用。</p><p> * 如果需要轉(zhuǎn)載本例程,請(qǐng)您注明作者。</p><p><b> *</b></p><p><b> * 作者: 劉作晨</b></p><p> * EMail:
7、liuzuochen@gmail.com</p><p><b> */</b></p><p> package liuzuochen.sample.upload;</p><p> import java.util.*;</p><p> public class FileUploadStatus {<
8、/p><p><b> //上傳用戶地址</b></p><p> private String uploadAddr;</p><p><b> //上傳總量</b></p><p> private long uploadTotalSize = 0;</p><p>
9、<b> //讀取上傳總量</b></p><p> private long readTotalSize = 0;</p><p><b> //當(dāng)前上傳文件號(hào)</b></p><p> private int currentUploadFileNum = 0;</p><p> //成
10、功讀取上傳文件數(shù)</p><p> private int successUploadFileCount = 0;</p><p><b> //狀態(tài)</b></p><p> private String status = "";</p><p><b> //處理起始時(shí)間<
11、/b></p><p> private long processStartTime = 0l;</p><p><b> //處理終止時(shí)間</b></p><p> private long processEndTime = 0l;</p><p><b> //處理執(zhí)行時(shí)間</b>
12、</p><p> private long processRunningTime = 0l;</p><p> //上傳文件URL列表</p><p> private List uploadFileUrlList = new ArrayList();</p><p><b> //取消上傳</b></p
13、><p> private boolean cancel = false;</p><p> //上傳base目錄</p><p> private String baseDir = "";</p><p> public FileUploadStatus() {</p><p><b&g
14、t; }</b></p><p> public String getBaseDir() {</p><p> return baseDir;</p><p><b> }</b></p><p> public void setBaseDir(String baseDir) {</p>
15、<p> this.baseDir = baseDir;</p><p><b> }</b></p><p> public boolean getCancel() {</p><p> return cancel;</p><p><b> }</b></p>
16、<p> public void setCancel(boolean cancel) {</p><p> this.cancel = cancel;</p><p><b> }</b></p><p> public List getUploadFileUrlList() {</p><p>
17、 return uploadFileUrlList;</p><p><b> }</b></p><p> public void setUploadFileUrlList(List uploadFileUrlList) {</p><p> this.uploadFileUrlList = uploadFileUrlList;<
18、/p><p><b> }</b></p><p> public long getProcessRunningTime() {</p><p> return processRunningTime;</p><p><b> }</b></p><p> public
19、 void setProcessRunningTime(long processRunningTime) {</p><p> this.processRunningTime = processRunningTime;</p><p><b> }</b></p><p> public long getProcessEndTime()
20、{</p><p> return processEndTime;</p><p><b> }</b></p><p> public void setProcessEndTime(long processEndTime) {</p><p> this.processEndTime = processEndT
21、ime;</p><p><b> }</b></p><p> public long getProcessStartTime() {</p><p> return processStartTime;</p><p><b> }</b></p><p> pu
22、blic void setProcessStartTime(long processStartTime) {</p><p> this.processStartTime = processStartTime;</p><p><b> }</b></p><p> public long getReadTotalSize() {<
23、/p><p> return readTotalSize;</p><p><b> }</b></p><p> public void setReadTotalSize(long readTotalSize) {</p><p> this.readTotalSize = readTotalSize;</p
24、><p><b> }</b></p><p> public int getSuccessUploadFileCount() {</p><p> return successUploadFileCount;</p><p><b> }</b></p><p> p
25、ublic void setSuccessUploadFileCount(int successUploadFileCount) {</p><p> this.successUploadFileCount = successUploadFileCount;</p><p><b> }</b></p><p> public int g
26、etCurrentUploadFileNum() {</p><p> return currentUploadFileNum;</p><p><b> }</b></p><p> public void setCurrentUploadFileNum(int currentUploadFileNum) {</p>&l
27、t;p> this.currentUploadFileNum = currentUploadFileNum;</p><p><b> }</b></p><p> public String getStatus() {</p><p> return status;</p><p><b>
28、}</b></p><p> public void setStatus(String status) {</p><p> this.status = status;</p><p><b> }</b></p><p> public long getUploadTotalSize() {<
29、/p><p> return uploadTotalSize;</p><p><b> }</b></p><p> public String getUploadAddr() {</p><p> return uploadAddr;</p><p><b> }</b&
30、gt;</p><p> public void setUploadTotalSize(long uploadTotalSize) {</p><p> this.uploadTotalSize = uploadTotalSize;</p><p><b> }</b></p><p> public void
31、setUploadAddr(String uploadAddr) {</p><p> this.uploadAddr = uploadAddr;</p><p><b> }</b></p><p> public String toJSon() {</p><p> StringBuffer strJSon
32、= new StringBuffer();</p><p> strJSon.append("{UploadTotalSize:").append(getUploadTotalSize()).append(</p><p><b> ",")</b></p><p> .append("R
33、eadTotalSize:").append(getReadTotalSize()).append(",")</p><p> .append("CurrentUploadFileNum:").append(getCurrentUploadFileNum()).</p><p> append(",")</p&
34、gt;<p> .append("SuccessUploadFileCount:").append(</p><p> getSuccessUploadFileCount()).append(",")</p><p> .append("Status:'").append(getStatus()).ap
35、pend("',")</p><p> .append("ProcessStartTime:").append(getProcessStartTime()).</p><p> append(",")</p><p> .append("ProcessEndTime:").
36、append(getProcessEndTime()).append(</p><p><b> ",")</b></p><p> .append("ProcessRunningTime:").append(getProcessRunningTime()).</p><p> append(&qu
37、ot;,")</p><p> .append("Cancel:").append(getCancel()).append("}");</p><p> return strJSon.toString();</p><p><b> }</b></p><p>&l
38、t;b> }</b></p><p> 2.1.2. 文件上傳狀態(tài)偵聽類(FileUploadListener)</p><p> 使用Common-FileUpload 1.2版本(20070103)。此版本提供了能夠監(jiān)視文件上傳情況的ProcessListener接口,使開發(fā)者通過FileUploadBase類對(duì)象的setProcessListener
39、方法植入自己的Listener。 FileUploadListener類實(shí)現(xiàn)了ProcessListener,在整個(gè)文件上傳過程中,它對(duì)上傳進(jìn)度進(jìn)行監(jiān)控,并且根據(jù)上傳 情況實(shí)時(shí)的更新上傳狀態(tài)Bean。源代碼如下:</p><p><b> /**</b></p><p> * 本例程演示了通過Web上傳文件過程中的進(jìn)度顯示。您可以對(duì)本例程進(jìn)行任何修改和使用。<
40、;/p><p> * 如果需要轉(zhuǎn)載本例程,請(qǐng)您注明作者。</p><p><b> *</b></p><p><b> * 作者: 劉作晨</b></p><p> * EMail:liuzuochen@gmail.com</p><p><b> */&l
41、t;/b></p><p> package liuzuochen.sample.upload;</p><p> import org.apache.commons.fileupload.ProgressListener;</p><p> import javax.servlet.http.HttpServletRequest;</p>
42、<p> public class FileUploadListener implements ProgressListener{</p><p> private HttpServletRequest request=null;</p><p> public FileUploadListener(HttpServletRequest request){</p&g
43、t;<p> this.request=request;</p><p><b> }</b></p><p><b> /**</b></p><p><b> * 更新狀態(tài)</b></p><p><b> */</b><
44、/p><p> public void update(long pBytesRead, long pContentLength, int pItems){</p><p> FileUploadStatus statusBean= BackGroundService.getStatusBean(request);</p><p> statusBean.setUp
45、loadTotalSize(pContentLength);</p><p><b> //讀取完成</b></p><p> if (pContentLength == -1) {</p><p> statusBean.setStatus("完成對(duì)" + pItems +"個(gè)文件的讀取:讀取了 "
46、; + pBytesRead + " bytes.");</p><p> statusBean.setReadTotalSize(pBytesRead);</p><p> statusBean.setSuccessUploadFileCount(pItems);</p><p> statusBean.setProcessEndTime
47、(System.currentTimeMillis());</p><p> statusBean.setProcessRunningTime(statusBean.getProcessEndTime());</p><p><b> //讀取中</b></p><p><b> } else {</b></p
48、><p> statusBean.setStatus("當(dāng)前正在處理第" + pItems +"個(gè)文件:已經(jīng)讀取了 " + pBytesRead + "/" + pContentLength+ " bytes.");</p><p> statusBean.setReadT
49、otalSize(pBytesRead);</p><p> statusBean.setCurrentUploadFileNum(pItems); </p><p> statusBean.setProcessRunningTime(System.currentTimeMillis());</p><p><b> }</b></
50、p><p> BackGroundService.saveStatusBean(request,statusBean);</p><p><b> }</b></p><p><b> }</b></p><p> 2.1.3. 后臺(tái)服務(wù)類(BackGroundService)<
51、/p><p> BackGroundService這個(gè)Servlet類負(fù)責(zé)接收Form Post數(shù)據(jù)、回應(yīng)狀態(tài)輪詢請(qǐng)求、處理取消文件上傳的請(qǐng)求。 盡管可以把這些功能相互分離開來,但為了簡(jiǎn)單明了,還是將它們放到Servlet中,只是由不同的方法進(jìn)行分割。 源代碼如下:</p><p><b> /**</b></p><p> * 本例程演示了
52、通過Web上傳文件過程中的進(jìn)度顯示。您可以對(duì)本例程進(jìn)行任何修改和使用。</p><p> * 如果需要轉(zhuǎn)載本例程,請(qǐng)您注明作者。</p><p><b> *</b></p><p><b> * 作者: 劉作晨</b></p><p> * EMail:liuzuochen@gmail.c
53、om</p><p><b> */</b></p><p> package liuzuochen.sample.upload;</p><p><b> /**</b></p><p> * Title: 后臺(tái)服務(wù)</p><p> * * Descriptio
54、n: 為客戶端提供上傳及文件傳輸狀態(tài)查詢服務(wù)</p><p><b> *</b></p><p><b> */</b></p><p> import java.io.File;</p><p> import java.io.IOException;</p><p&
55、gt; import java.util.List;</p><p> import javax.servlet.ServletException;</p><p> import javax.servlet.http.HttpServletRequest;</p><p> import javax.servlet.http.HttpServletResp
56、onse;</p><p> import org.apache.commons.fileupload.FileItem;</p><p> import org.apache.commons.fileupload.FileUploadException;</p><p> import org.apache.commons.fileupload.disk.D
57、iskFileItemFactory;</p><p> import org.apache.commons.fileupload.servlet.*;</p><p> public class BackGroundService extends javax.servlet.http.HttpServlet implements</p><p> javax
58、.servlet.Servlet {</p><p> public static final String UPLOAD_DIR = "/upload";</p><p> public static final String DEFAULT_UPLOAD_FAILURE_URL = "./result.jsp";</p><
59、;p> public BackGroundService() {</p><p><b> super();</b></p><p><b> }</b></p><p> protected void doGet(HttpServletRequest request,</p><p>
60、; HttpServletResponse response) throws ServletException,</p><p> IOException {</p><p> doPost(request, response);</p><p><b> }</b></p><p><b> /**
61、</b></p><p> * 從文件路徑中取出文件名</p><p><b> */</b></p><p> private String takeOutFileName(String filePath) {</p><p> int pos = filePath.lastIndexOf(File
62、.separator);</p><p> if (pos > 0) {</p><p> return filePath.substring(pos + 1);</p><p><b> } else {</b></p><p> return filePath;</p><p>
63、<b> }</b></p><p><b> }</b></p><p><b> /**</b></p><p> * 從request中取出FileUploadStatus Bean</p><p><b> */</b></p>
64、;<p> public static FileUploadStatus getStatusBean(</p><p> HttpServletRequest request) {</p><p> BeanControler beanCtrl = BeanControler.getInstance();</p><p> return bea
65、nCtrl.getUploadStatus(request.getRemoteAddr());</p><p><b> }</b></p><p><b> /**</b></p><p> * 把FileUploadStatus Bean保存到類控制器BeanControler</p><p&
66、gt;<b> */</b></p><p> public static void saveStatusBean(</p><p> HttpServletRequest request,</p><p> FileUploadStatus statusBean) {</p><p> statusBean.
67、setUploadAddr(request.getRemoteAddr());</p><p> BeanControler beanCtrl = BeanControler.getInstance();</p><p> beanCtrl.setUploadStatus(statusBean);</p><p><b> }</b>&l
68、t;/p><p><b> /**</b></p><p> * 刪除已經(jīng)上傳的文件</p><p><b> */</b></p><p> private void deleteUploadedFile(HttpServletRequest request) {</p><
69、;p> FileUploadStatus satusBean = getStatusBean(request);</p><p> for (int i = 0; i < satusBean.getUploadFileUrlList().size(); i++) {</p><p> File uploadedFile = new File(request.getReal
70、Path(UPLOAD_DIR) +</p><p> File.separator +</p><p> satusBean.getUploadFileUrlList().</p><p><b> get(i));</b></p><p> uploadedFile.delete();</p>
71、<p><b> }</b></p><p> satusBean.getUploadFileUrlList().clear();</p><p> satusBean.setStatus("刪除已上傳的文件");</p><p> saveStatusBean(request, satusBean);&l
72、t;/p><p><b> }</b></p><p><b> /**</b></p><p> * 上傳過程中出錯(cuò)處理</p><p><b> */</b></p><p> private void uploadExceptionHandl
73、e(</p><p> HttpServletRequest request,</p><p> String errMsg) throws ServletException, IOException {</p><p> //首先刪除已經(jīng)上傳的文件</p><p> deleteUploadedFile(request);</
74、p><p> FileUploadStatus satusBean = getStatusBean(request);</p><p> satusBean.setStatus(errMsg);</p><p> saveStatusBean(request, satusBean);</p><p><b> }</b&g
75、t;</p><p><b> /**</b></p><p> * 初始化文件上傳狀態(tài)Bean</p><p><b> */</b></p><p> private FileUploadStatus initStatusBean(HttpServletRequest</p>
76、<p> request) {</p><p> FileUploadStatus satusBean = new FileUploadStatus();</p><p> satusBean.setStatus("正在準(zhǔn)備處理");</p><p> satusBean.setUploadTotalSize(request
77、.getContentLength());</p><p> satusBean.setProcessStartTime(System.currentTimeMillis());</p><p> satusBean.setBaseDir(request.getContextPath() + UPLOAD_DIR);</p><p> return satus
78、Bean;</p><p><b> }</b></p><p><b> /**</b></p><p><b> * 處理文件上傳</b></p><p><b> */</b></p><p> private vo
79、id processFileUpload(HttpServletRequest request,</p><p> HttpServletResponse response) throws</p><p> ServletException, IOException {</p><p> DiskFileItemFactory factory = new Di
80、skFileItemFactory();</p><p> //設(shè)置內(nèi)存緩沖區(qū),超過后寫入臨時(shí)文件</p><p> factory.setSizeThreshold(10240000);</p><p> //設(shè)置臨時(shí)文件存儲(chǔ)位置</p><p> factory.setRepository(new File(request.get
81、RealPath("/upload/temp")));</p><p> ServletFileUpload upload = new ServletFileUpload(factory);</p><p> //設(shè)置單個(gè)文件的最大上傳值</p><p> upload.setFileSizeMax(102400000);</p>
82、;<p> //設(shè)置整個(gè)request的最大值</p><p> upload.setSizeMax(102400000);</p><p> upload.setProgressListener(new FileUploadListener(request));</p><p> //保存初始化后的FileUploadStatus Bean&
83、lt;/p><p> saveStatusBean(request, initStatusBean(request));</p><p> String forwardURL = "";</p><p><b> try {</b></p><p> List items = upload.par
84、seRequest(request);</p><p><b> //獲得返回url</b></p><p> for (int i = 0; i < items.size(); i++) {</p><p> FileItem item = (FileItem) items.get(i);</p><p>
85、 if (item.isFormField()) {</p><p> forwardURL = item.getString();</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p
86、><p><b> //處理文件上傳</b></p><p> for (int i = 0; i < items.size(); i++) {</p><p> FileItem item = (FileItem) items.get(i);</p><p><b> //取消上傳</b>
87、;</p><p> if (getStatusBean(request).getCancel()) {</p><p> deleteUploadedFile(request);</p><p><b> break;</b></p><p><b> }</b></p>&
88、lt;p><b> //保存文件</b></p><p> else if (!item.isFormField() && item.getName().length() > 0) {</p><p> String fileName = takeOutFileName(item.getName());</p><
89、p> File uploadedFile = new File(request.getRealPath(UPLOAD_DIR) +</p><p> File.separator + fileName);</p><p> item.write(uploadedFile);</p><p> //更新上傳文件列表</p><p>
90、; FileUploadStatus satusBean =</p><p> getStatusBean(request);</p><p> satusBean.getUploadFileUrlList().add(fileName);</p><p> saveStatusBean(request, satusBean);</p><
91、;p> Thread.sleep(500);</p><p><b> }</b></p><p><b> }</b></p><p> } catch (FileUploadException e) {</p><p> uploadExceptionHandle(request
92、, "上傳文件時(shí)發(fā)生錯(cuò)誤:" + e.getMessage());</p><p> } catch (Exception e) {</p><p> uploadExceptionHandle(request, "保存上傳文件時(shí)發(fā)生錯(cuò)誤:" + e.getMessage());</p><p><b> }&
93、lt;/b></p><p> if (forwardURL.length() == 0) {</p><p> forwardURL = DEFAULT_UPLOAD_FAILURE_URL;</p><p><b> }</b></p><p> request.getRequestDispatcher
94、(forwardURL).forward(request, response);</p><p><b> }</b></p><p><b> /**</b></p><p> * 回應(yīng)上傳狀態(tài)查詢</p><p><b> */</b></p><
95、;p> private void responseStatusQuery(HttpServletRequest request,</p><p> HttpServletResponse response) throws</p><p> IOException {</p><p> response.setContentType("text
96、/xml");</p><p> response.setHeader("Cache-Control", "no-cache");</p><p> FileUploadStatus satusBean = getStatusBean(request);</p><p> response.getWriter(
97、).write(satusBean.toJSon());</p><p><b> }</b></p><p><b> /**</b></p><p> * 處理取消文件上傳</p><p><b> */</b></p><p> priv
98、ate void processCancelFileUpload(HttpServletRequest request,</p><p> HttpServletResponse response) throws</p><p> IOException {</p><p> FileUploadStatus satusBean = getStatusBean
99、(request);</p><p> satusBean.setCancel(true);</p><p> saveStatusBean(request, satusBean);</p><p> responseStatusQuery(request, response);</p><p><b> }</b&g
100、t;</p><p> protected void doPost(HttpServletRequest request,</p><p> HttpServletResponse response) throws ServletException,</p><p> IOException {</p><p> boolean is
101、Multipart = ServletFileUpload.isMultipartContent(request);</p><p> if (isMultipart) {</p><p> processFileUpload(request, response);</p><p><b> } else {</b></p>
102、<p> request.setCharacterEncoding("UTF-8");</p><p> if (request.getParameter("uploadStatus") != null) {</p><p> responseStatusQuery(request, response);</p>&l
103、t;p><b> }</b></p><p> if (request.getParameter("cancelUpload") != null) {</p><p> processCancelFileUpload(request, response);</p><p><b> }</b&g
104、t;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 2.1.4. 文件上傳狀態(tài)控制類(BeanControler)</p><p> 這是一個(gè)單例類
105、,它的功能是為客戶端保存文件上傳狀態(tài),這里我沒有使用Session來存儲(chǔ)文件上傳狀態(tài),因?yàn)閷?duì)于AJAX這種異步調(diào)用,服務(wù)器會(huì)開啟不同的Session,所以無法通過Session保存文件上傳狀態(tài)。 我并不認(rèn)為這種方法最好,如果有更好的方法,歡迎大家一起討論。 源代碼如下:</p><p><b> /**</b></p><p> * 本例程演示了通過Web上傳文件
106、過程中的進(jìn)度顯示。您可以對(duì)本例程進(jìn)行任何修改和使用。</p><p> * 如果需要轉(zhuǎn)載本例程,請(qǐng)您注明作者。</p><p><b> *</b></p><p><b> * 作者: 劉作晨</b></p><p> * EMail:liuzuochen@gmail.com</p&
107、gt;<p><b> */</b></p><p> package liuzuochen.sample.upload;</p><p><b> /**</b></p><p> * Title: 類控制器</p><p><b> *</b>&l
108、t;/p><p> * Description: 主要作用是對(duì)FileUploadStatus進(jìn)行管理,為客戶端提供相應(yīng)的</p><p> * FileUploadStatus類對(duì)象。這是一個(gè)單例類。</p><p><b> *</b></p><p><b> */</b></p&g
109、t;<p> import java.util.Vector;</p><p> public class BeanControler {</p><p> private static BeanControler beanControler = new BeanControler();</p><p> private Vector vect
110、or = new Vector();</p><p> private BeanControler() {</p><p><b> }</b></p><p> public static BeanControler getInstance() {</p><p> return beanControler;&
111、lt;/p><p><b> }</b></p><p><b> /**</b></p><p> * 取得相應(yīng)FileUploadStatus類對(duì)象的存儲(chǔ)位置</p><p><b> */</b></p><p> private int i
112、ndexOf(String strID) {</p><p> int nReturn = -1;</p><p> for (int i = 0; i < vector.size(); i++) {</p><p> FileUploadStatus status = (FileUploadStatus) vector.elementAt(i);<
113、;/p><p> if (status.getUploadAddr().equals(strID)) {</p><p> nReturn = i;</p><p><b> break;</b></p><p><b> }</b></p><p><b>
114、 }</b></p><p> return nReturn;</p><p><b> }</b></p><p><b> /**</b></p><p> * 取得相應(yīng)FileUploadStatus類對(duì)象</p><p><b> */
115、</b></p><p> public FileUploadStatus getUploadStatus(String strID) {</p><p> return (FileUploadStatus) vector.elementAt(indexOf(strID));</p><p><b> }</b></p&
116、gt;<p><b> /**</b></p><p> * 存儲(chǔ)FileUploadStatus類對(duì)象</p><p><b> */</b></p><p> public void setUploadStatus(FileUploadStatus status) {</p><
117、;p> int nIndex = indexOf(status.getUploadAddr());</p><p> if ( -1 == nIndex) {</p><p> vector.add(status);</p><p><b> } else {</b></p><p> vector.in
118、sertElementAt(status, nIndex);</p><p> vector.removeElementAt(nIndex + 1);</p><p><b> }</b></p><p><b> }</b></p><p><b> /**</b>&
119、lt;/p><p> * 刪除FileUploadStatus類對(duì)象</p><p><b> */</b></p><p> public void removeUploadStatus(String strID){</p><p> int nIndex = indexOf(strID);</p>
120、<p> if(-1!=nIndex)</p><p> vector.removeElementAt(nIndex);</p><p><b> }</b></p><p><b> }</b></p><p> 2.2. 客戶端代碼</p><p
121、> 客戶端我們采用Prototype框架。請(qǐng)下載。</p><p> 2.2.1. AjaxWrapper.js</p><p> AjaxWrapper.js對(duì)Prototype進(jìn)行了封裝。請(qǐng)下載分析</p><p> 2.2.2. fileUpload.html</p><p> fileUpload.
122、html是文件上傳界面。 請(qǐng)下載。 </p><p> 2.2.3. result.jsp</p><p> result.jsp是文件上傳結(jié)果顯示界面。 請(qǐng)下載 </p><p> 2.2.4. fileUpload.css</p><p> fileUpload.css是樣式文件。 源代碼如下:</p&g
123、t;<p> body { color:#000; background-color:white; font:15px Georgia, "Lucida Grande", Arial, sans-serif; letter-spacing:0.01em; margin:15px;
124、}#controlPanel,#resultPanel{ width:700px; margin:20px auto; padding:25px; border:3px solid gray; -moz-border-radius:10px; background:#f8f8f8;}#er
125、rorArea{ width:400px; margin:20px auto; padding:25px; border:3px solid gray; -moz-border-radius:10px; background:red;}#normalMessageArea{
126、160; width:400px; margin:20px auto; paddi</p><p><b> 2.3. 配置文件</b></p><p> web.xml中完成Servlet的配置。</p><p> <?xml version="1.0&
127、quot; encoding="UTF-8"?><web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sch
128、emaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>AjaxPractice</display-name><servlet> <description></descri
129、ption> <display-name>BackGroundService</display-name> <servlet-name>BackGroundService</servlet-name> <servlet-class>liuzuochen.sample.upload.BackG</
130、p><p><b> 3. 結(jié)語</b></p><p> 整個(gè)程序到這里就介紹完了,希望它多少能為您的工作或?qū)W習(xí)帶來點(diǎn)兒幫助。 </p><p> 大學(xué)本科生畢業(yè)設(shè)計(jì)(論文)撰寫規(guī)范</p><p> 本科生畢業(yè)設(shè)計(jì)(論文)是學(xué)生在畢業(yè)前提交的一份具有一定研究?jī)r(jià)值和實(shí)用價(jià)值的學(xué)術(shù)資料。它既是本科學(xué)生開始從
131、事工程設(shè)計(jì)、科學(xué)實(shí)驗(yàn)和科學(xué)研究的初步嘗試,也是學(xué)生在教師的指導(dǎo)下,對(duì)所進(jìn)行研究的適當(dāng)表述,還是學(xué)生畢業(yè)及學(xué)位資格認(rèn)定的重要依據(jù)。畢業(yè)論文撰寫是本科生培養(yǎng)過程中的基本訓(xùn)練環(huán)節(jié)之一,應(yīng)符合國(guó)家及各專業(yè)部門制定的有關(guān)標(biāo)準(zhǔn),符合漢語語法規(guī)范。指導(dǎo)教師應(yīng)加強(qiáng)指導(dǎo),嚴(yán)格把關(guān)。</p><p><b> 1、論文結(jié)構(gòu)及要求</b></p><p> 論文包括題目、中文摘要、外文
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- ajax上傳
- 基于ajax的web聊天系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 基于Ajax的Web框架設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于AJAX技術(shù)的Deep Web爬蟲實(shí)現(xiàn)方法研究.pdf
- 基于AJAX技術(shù)的WEB應(yīng)用框架的研究與實(shí)現(xiàn).pdf
- 基于Ajax的WEB應(yīng)用技術(shù)的研究與實(shí)現(xiàn).pdf
- jsp基于web版的博客設(shè)計(jì)與實(shí)現(xiàn)論文
- 基于ajax技術(shù)的web會(huì)議平臺(tái)
- 基于web過程模擬的動(dòng)態(tài)web信息獲取說明書
- 基于AJAX的Web即時(shí)通信系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn).pdf
- 基于AJAX的可復(fù)用Web報(bào)表系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn).pdf
- 基于jsp技術(shù)的web?。纾椋?/a>
- 基于web的新聞發(fā)布系統(tǒng)0說明書
- 基于web的汽車租賃管理系統(tǒng)說明書
- 基于web的新聞發(fā)布管理系統(tǒng)說明書
- 基于Ajax-REST風(fēng)格的Web Service的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于ajax技術(shù)的web頁(yè)面局部刷新
- SharePoint文件上傳系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- jsp基于web版的博客設(shè)計(jì)與實(shí)現(xiàn)論文.doc
- 支持Ajax的Deep Web爬蟲設(shè)計(jì)與實(shí)現(xiàn).pdf
評(píng)論
0/150
提交評(píng)論