文件上傳就是將客戶端資源,通過網(wǎng)路傳遞到服務(wù)器端。
目前成都創(chuàng)新互聯(lián)公司已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、叢臺(tái)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
因?yàn)槲募?shù)據(jù)比較大,必須通過文件上傳才可以完成將數(shù)據(jù)保存到數(shù)據(jù)庫端的操作。
文件上傳的本質(zhì)就是IO流操作。
演示:文件上傳應(yīng)該如何操作?
瀏覽器端:
1.method=post 只有post才可以攜帶大數(shù)據(jù)
2.必須使用input type='file' name='f'要有name屬性
3.encType="multipart/form-data"
服務(wù)器端:
request對(duì)象是用于獲取請(qǐng)求信息。
它有一個(gè)方法 ?getInputStream(); 可以獲取一個(gè)字節(jié)輸入流,通過這個(gè)流,可以讀取到
所有的請(qǐng)求正文信息.
文件上傳原理:
瀏覽器端注意上述三件事,在服務(wù)器端通過流將數(shù)據(jù)讀取到,在對(duì)數(shù)據(jù)進(jìn)行解析.
將上傳文件內(nèi)容得到,保存在服務(wù)器端,就完成了文件上傳。
注意:在實(shí)際開發(fā)中,不需要我們進(jìn)行數(shù)據(jù)解析,完成文件上傳。因?yàn)槲覀儠?huì)使用文件上傳的工具,它們已經(jīng)封裝好的,提供API,只要調(diào)用它們的API就可以完成文件上傳操作.我們使用的commons-fileupload,它是apache提供的一套開源免費(fèi)的文件上傳工具。
代碼演示文件上傳的原理:
在WebRoot下新建upload1.jsp
[html]?view plain?copy
%@?page?language="java"?import="java.util.*"?pageEncoding="UTF-8"%
!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"
html
head
titleMy?JSP?'index.jsp'?starting?page/title
/head
body
!--?encType?默認(rèn)是application/x-www-form-urlencoded?--
form?action="${pageContext.request.contextPath?}/upload1"
method="POST"?enctype="multipart/form-data"
input?type="text"?name="content"br
input?type="file"?name="f"br?input?type="submit"
value="上傳"
/form
/body
/html
新建Upload1Servlet ?路徑:/upload1
[java]?view plain?copy
package?cn.itcast.web.servlet;
import?java.io.IOException;
import?java.io.InputStream;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
public?class?Upload1Servlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
//?System.out.println("upload1?servlet......");
//?通過request獲取一個(gè)字節(jié)輸入流,將所有的請(qǐng)求正文信息讀取到,打印到控制臺(tái)
InputStream?is?=?request.getInputStream();
byte[]?b?=?new?byte[1024];
int?len?=?-1;
while?((len?=?is.read(b))?!=?-1)?{
System.out.println(new?String(b,?0,?len));
}
is.close();
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
}
在瀏覽器端訪問信息如下:
后臺(tái)打印正文信息如下:
文件上傳概述
實(shí)現(xiàn)web開發(fā)中的文件上傳功能,需要完成如下二步操作:
在web頁面中添加上傳輸入項(xiàng)。
在Servlet中讀取上傳文件的數(shù)據(jù),并保存在服務(wù)器硬盤中。
如何在web頁面中添加上傳輸入項(xiàng)?
input ?type="file"標(biāo)簽用于在web頁面中添加文件上傳輸入項(xiàng),設(shè)置文件上傳輸入項(xiàng)時(shí)注意:
1、必須設(shè)置input輸入項(xiàng)的name屬性,否則瀏覽器將不會(huì)發(fā)送上傳文件的數(shù)據(jù)。
2、必須把form的encType屬性設(shè)為multipart/form-data 設(shè)置該值后,瀏覽器在上傳文件時(shí),并把文件數(shù)據(jù)附帶在http請(qǐng)求消息體內(nèi),并使用MIME協(xié)議對(duì)上傳的文件進(jìn)行描述,以方便接收方對(duì)上傳數(shù)據(jù)進(jìn)行解析和處理。
3、表單的提交方式要設(shè)置為post。
如何在Servlet中讀取文件上傳數(shù)據(jù),并保存到本地硬盤中?
Request對(duì)象提供了一個(gè)getInputStream方法,通過這個(gè)方法可以讀取到客戶端提交過來的數(shù)據(jù)。但由于用戶可能會(huì)同時(shí)上傳多個(gè)文件,在servlet端編程直接讀取上傳數(shù)據(jù),并分別解析出相應(yīng)的文件數(shù)據(jù)是一項(xiàng)非常麻煩的工作,示例。
為方便用戶處理文件上傳數(shù)據(jù),Apache 開源組織提供了一個(gè)用來處理表單文件上傳的一個(gè)開源組件( Commons-fileupload ),該組件性能優(yōu)異,并且其API使用極其簡單,可以讓開發(fā)人員輕松實(shí)現(xiàn)web文件上傳功能,因此在web開發(fā)中實(shí)現(xiàn)文件上傳功能,通常使用Commons-fileupload組件實(shí)現(xiàn)。
使用Commons-fileupload組件實(shí)現(xiàn)文件上傳,需要導(dǎo)入該組件相應(yīng)支撐jar包:Commons-fileupload和commons-io。commo-io不屬于文件上傳組件的開發(fā)jar文件,但Commons-fileupload組件從1.1版本開始,它工作時(shí)需要commons-io包的支持。
搞清楚兩個(gè)問題:上傳到自己的服務(wù)器還是第三方平臺(tái)?播放器實(shí)用Flash還是H5播放器?
如果是上傳到自己的服務(wù)器,使用H5播放。那上傳視頻就和普通的文件上傳一樣。都是通過Http上傳。前端可以使用form表單上傳也可以使用ajax異步上傳。后臺(tái)可以使用apache的Common-fileUpload工具來解析并保存文件。然后生成一個(gè)訪問路徑。將訪問路徑返回給前端的 video標(biāo)簽的src屬性即可。通過幾個(gè)簡單的屬性或腳本就能控制播放。
如果是上傳到第三方平臺(tái),例如騰訊視頻、愛奇藝、優(yōu)酷等。他們都有開發(fā)者平臺(tái)或者開放平臺(tái)。一般都有一些jar工具類或者模板案例提供給你的。你上傳之后,也有返回路徑給你。這是一般都是嵌入它們的Flash插件。所以你只需要將那段Flash插件的HTML代碼放入你的網(wǎng)頁中就可以播放了。好處是,不需要自己存儲(chǔ)。不需要準(zhǔn)備播放器。壞處是,可能有廣告。不是可能。是一定會(huì)有。
t
修改Web.xml文件
設(shè)置每15分鐘運(yùn)行的Servlet
servlet servlet-name='alarm' servlet-class='test.TestAlarm'
run-at:00, :15, :30, :45/run-at
/servlet
設(shè)置每天16:30和20:00運(yùn)行的Servlet
servlet servlet-name='alarm' servlet-class='test.TestAlarm'
run-at16:30,20:00/run-at
/servlet
容器只為每個(gè)servlet創(chuàng)建一個(gè)實(shí)例,這意味著servlet必須是線程安全的,即,能夠同時(shí)
處理多個(gè)請(qǐng)求,每個(gè)處理都通過servlet代碼作為單獨(dú)的線程來處理。
將servlet作為所有應(yīng)用程序請(qǐng)求的公共入口點(diǎn)時(shí),可以獲得對(duì)應(yīng)用程序頁面流的整體控制。
當(dāng)使用servlet作為控制器時(shí),必須處理下列基本要求:
所有請(qǐng)求處理都必須傳遞到單獨(dú)的控制器servlet中。
servlet必須能夠區(qū)分請(qǐng)求,以便進(jìn)行不同類型的處理。
可以使用現(xiàn)成的struts servlet。
struts servlet根據(jù)請(qǐng)求URI中的一部分來斷定請(qǐng)求的類型,查找對(duì)應(yīng)的行為類(使用配制信息),并調(diào)用execute()方法。
execute()方法不顯示應(yīng)答,只關(guān)心商務(wù)邏輯。該方法返回一個(gè)strutsActionForward實(shí)例,其中包含應(yīng)答應(yīng)該調(diào)用以顯示應(yīng)答的JSP頁面的相關(guān)信息。該頁面由邏輯名稱進(jìn)行標(biāo)示,并影射到配置文件中的實(shí)際頁面邏輯上。因此可以通過重新配置,而不是改變代碼,從而至少在某種程度上控制頁面流。
使用servlet的最佳解決方案是定義servlet的映射規(guī)則:
而不是使用:/myapp/servlet開頭的調(diào)用,或是使用
form action=”/ora/servlet/controller/someAction”
以上方式的調(diào)用servlet將會(huì)導(dǎo)致安全問題和程序部署的問題。
servlet的service()方法與doGet()、doPost()方法區(qū)別:
public void service(request,response) {
if request.getMethod().equals("POST") {
doPost(request,response);
}else if request.getMethod().equals("GET") {
doGet(request,response);
}
}
有用戶請(qǐng)求,對(duì)應(yīng)有g(shù)et/post才會(huì)調(diào)用doGet()/doPost(),service()有無請(qǐng)求都執(zhí)行或用在定時(shí)執(zhí)行。
Servlet是用Java編寫的Server端程序,它與協(xié)議和平臺(tái)無關(guān)。Servlet運(yùn)行于Java-enabled Web Server中。Java Servlet可以動(dòng)態(tài)地?cái)U(kuò)展Server的能力,并采用請(qǐng)求-響應(yīng)模式提供Web服務(wù)。
最早支持Servlet技術(shù)的是JavaSoft的Java Web Server。此后,一些其它的基于Java的Web Server開始支持標(biāo)準(zhǔn)的Servlet API。
一、Servlet的特點(diǎn)
Servlet是Java技術(shù)對(duì)CGI編程的回答。Servlet程序在服務(wù)器端運(yùn)行,動(dòng)態(tài)地生成Web頁面。與傳統(tǒng)的CGI和許多其他類似CGI的技術(shù)相比,Java Servlet具有更高的效率,更容易使用,功能更強(qiáng)大,具有更好的可移植性,更節(jié)省投資(更重要的是, Servlet程序員收入要比Perl程序員高:-)
高效
在傳統(tǒng)的CGI中,每個(gè)請(qǐng)求都要啟動(dòng)一個(gè)新的進(jìn)程,如果CGI程序本身的執(zhí)行時(shí)間較短,啟動(dòng)進(jìn)程所需要的開銷很可能反而超過實(shí)際執(zhí)行時(shí)間。而在Servlet中,每個(gè)請(qǐng)求由一個(gè)輕量級(jí)的Java線程處理(而不是重量級(jí)的操作系統(tǒng)進(jìn) 程)。在傳統(tǒng)CGI中,如果有N個(gè)并發(fā)的對(duì)同一CGI程序的請(qǐng)求,則該CGI程序的代碼在內(nèi)存中重復(fù)裝載了N次;而對(duì)于Servlet,處理請(qǐng)求的是N個(gè) 線程,只需要一份Servlet類代碼。在性能優(yōu)化方面,Servlet也比CGI有著更多的選擇,比如緩沖以前的計(jì)算結(jié)果,保持?jǐn)?shù)據(jù)庫連接的活動(dòng),等等。
方便
Servlet提供了大量的實(shí)用工具例程,例如自動(dòng)地解析和解碼HTML表單數(shù)據(jù)、讀取和設(shè)置HTTP頭、處理Cookie、跟蹤會(huì)話狀態(tài)等。
功能強(qiáng)大
在Servlet中,許多使用傳統(tǒng)CGI程序很難完成的任務(wù)都可以輕松地完成。例如,Servlet能夠直接和Web服務(wù)器交互,而普通的CGI程序不能。Servlet還能夠在各個(gè)程序之間共享數(shù)據(jù),使得數(shù)據(jù)庫連接池之類的功能很容易實(shí)現(xiàn)。
可移植性好
Servlet用Java編寫,Servlet API具有完善的標(biāo)準(zhǔn)。因此,為I-Planet Enterprise Server寫的Servlet無需任何實(shí)質(zhì)上的改動(dòng)即可移植到Apache、Microsoft IIS或者WebStar。幾乎所有的主流服務(wù)器都直接或通過插件支持Servlet。
節(jié)省投資
不僅有許多廉價(jià)甚至免費(fèi)的Web服務(wù)器可供個(gè)人或小規(guī)模網(wǎng)站使用,而且對(duì)于現(xiàn)有的服務(wù)器,如果它不支持Servlet的話,要加上這部分功能也往往是免費(fèi)的(或只需要極少的投資)。
二、Servlet的主要功能
Servlet的主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài)Web內(nèi)容。這個(gè)過程為:
客戶端發(fā)送請(qǐng)求至服務(wù)器端;
服務(wù)器將請(qǐng)求信息發(fā)送至Servlet
Servlet生成響應(yīng)內(nèi)容并將其傳給Server。響應(yīng)內(nèi)容動(dòng)態(tài)生成,通常取決于客戶端的請(qǐng)求
服務(wù)器將響應(yīng)返回給客戶端
Servlet看起來像是通常的Java程序。Servlet導(dǎo)入特定的屬于Java Servlet API的包。因?yàn)槭菍?duì)象字節(jié)碼,可動(dòng)態(tài)地從網(wǎng)絡(luò)加載,可以說Servlet對(duì)Server就如同Applet對(duì)Client一樣,但是,由于Servlet運(yùn)行于Server中,它們并不需要一個(gè)圖形用戶界面。從這個(gè)角度講,Servlet也被稱為Faceless Object。
三、JAVA Servlet的優(yōu)勢
Servlet可以和其他資源(文件、數(shù)據(jù)庫、Applet、Java應(yīng)用程序等)交互,以生成返回給客戶端的響應(yīng)內(nèi)容。如果需要,還可以保存請(qǐng)求-響應(yīng)過程中的信息。
采用Servlet,服務(wù)器可以完全授權(quán)對(duì)本地資源的訪問(如數(shù)據(jù)庫),并且Servlet自身將會(huì)控制外部用戶的訪問數(shù)量及訪問性質(zhì)
Servlet可以是其它服務(wù)的客戶端程序,例如,它們可以用于分布式的應(yīng)用系統(tǒng)中,可以從本地硬盤,或者通過網(wǎng)絡(luò)從遠(yuǎn)端硬盤激活Servlet。
Servlet可被鏈接(chain)。一個(gè)Servlet可以調(diào)用另一個(gè)或一系列Servlet,即成為它的客戶端。
采用Servlet Tag技術(shù),可以在HTML頁面中動(dòng)態(tài)調(diào)用Servlet。
Servlet API與協(xié)議無關(guān)。它并不對(duì)傳遞它的協(xié)議有任何假設(shè)。
像所有的Java程序一樣,Servlet擁有面向?qū)ο驤ava語言的所有優(yōu)勢
Servlet提供了Java應(yīng)用程序的所有優(yōu)勢——可移植、穩(wěn)健、易開發(fā)。使用Servlet 的Tag技術(shù),Servlet能夠生成嵌于靜態(tài)HTML頁面中的動(dòng)態(tài)內(nèi)容。
一個(gè)Servlet被客戶端發(fā)送的第一個(gè)請(qǐng)求激活,然后它將繼續(xù)運(yùn)行于后臺(tái),等待以后的請(qǐng)求。每個(gè)請(qǐng)求將生成一個(gè)新的線程,而不是一個(gè)完整的進(jìn)程。多個(gè)客戶能夠在同一個(gè)進(jìn)程中同時(shí)得到服務(wù)。一般來說,Servlet進(jìn)程只是在Web Server卸載時(shí)被卸載。
四、Servlet生命周期
裝載Servlet。這項(xiàng)操作一般是動(dòng)態(tài)執(zhí)行的。然而,Server通常會(huì)提供一個(gè)管理的選項(xiàng),用于在Server啟動(dòng)時(shí)強(qiáng)制裝載和初始化特定的Servlet。
Server創(chuàng)建一個(gè)Servlet的實(shí)例
Server調(diào)用Servlet的init()方法
一個(gè)客戶端的請(qǐng)求到達(dá)Server
Server創(chuàng)建一個(gè)請(qǐng)求對(duì)象
Server創(chuàng)建一個(gè)響應(yīng)對(duì)象
Server激活Servlet的service()方法,傳遞請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)
service()方法獲得關(guān)于請(qǐng)求對(duì)象的信息,處理請(qǐng)求,訪問其他資源,獲得需要的信息
service()方法使用響應(yīng)對(duì)象的方法,將響應(yīng)傳回Server,最終到達(dá)客戶端。service()方法可能激活其它方法以處理請(qǐng)求,如doGet()或doPost()或程序員自己開發(fā)的新的方法
對(duì)于更多的客戶端請(qǐng)求,Server創(chuàng)建新的請(qǐng)求和響應(yīng)對(duì)象,仍然激活此Servlet的 service()方法,將這兩個(gè)對(duì)象作為參數(shù)傳遞給它。如此重復(fù)以上的循環(huán),但無需再次調(diào)用init()方法。一般Servlet只初始化一次 ,當(dāng)Server不再需要Servlet時(shí)(一般當(dāng)Server關(guān)閉時(shí)),Server調(diào)用Servlet的Destroy()方法。
在美國,EJB+Servlet+JSP幾乎成為電子商務(wù)的開發(fā)標(biāo)準(zhǔn)。本來 ASP 也很有希望,但微軟最近可能把精力都集中在打官司和Win2000上, 因此電子商務(wù)發(fā)展得太少。PHP由于其模式和一些天生缺陷,毫無希望。 在美國,很少有商業(yè)站點(diǎn)用PHP的
方法/步驟
1
首先這里jsp頁面的代碼 定義布局文件html的 如圖所示
這是js文件 打開一個(gè)新子窗口和向頁面中加載視頻播放標(biāo)簽
上傳文件java代碼 獲取時(shí)間轉(zhuǎn)換成字符串作為上傳之后的文件名以及設(shè)置保存路徑和傳值到j(luò)sp頁面
這里copy代碼 將一個(gè)源文件復(fù)制到新的目錄路徑下 如圖所示
這里upload的jsp文件 用來選擇視頻文件并提交給后臺(tái)
展示舊文件名新文件名和上傳后的文件目錄路徑 并將其傳給父頁面即index.jsp
upload.jsp文件提交的代碼經(jīng)過java文件處理后通過控制轉(zhuǎn)到upload_video.jsp
代碼片段已經(jīng)貼出來了,接下來我們開始演示界面 打開后如圖所示 點(diǎn)擊上傳按鈕
點(diǎn)擊選擇文件 找到要上傳的視頻文件 選中后選擇打開 然后點(diǎn)擊確定按鈕
這里就是顯示新舊文件名和文件目錄路徑的界面 點(diǎn)擊確定將文件目錄傳給父文件界面
如圖所示 目錄路徑已經(jīng)出給input中了 點(diǎn)擊播放按鈕 就會(huì)出現(xiàn)播放界面并且自動(dòng)播放了