一、文件上傳
上傳文件是Web開發(fā)中經(jīng)常要用到的功能:例如在基于B/S的人事信息管理系統(tǒng)中上傳照片,在新聞發(fā)布系統(tǒng)中上傳圖片等等。。。。。要實現(xiàn)文件上傳功能,就需要綜合利用java中的文件輸入和輸出相關的類。
在TCP/IP中,最早出現(xiàn)的文件上傳機制是FTP。它是將文件由客服端發(fā)送到服務器的標準機制,能夠考慮到跨平臺的文本和二進制格式文件。但是在jsp編程中不能使用FTP方法來上傳文件,這是由jsp 運行機制所決定的。
下面是上傳文件的jsp頁面:
復制代碼 代碼如下:
form action="file?file=upload" method="post" enctype="multipart/form-data">
請選擇你要上傳的文件:input type="file" name="upload" siez="16">br>
input type="submit" value="提交">
/form>
對于文件上傳表單處理其中method必須為post,也要增加類型enctype="multipart/form-data"。這樣就可以把文件中的數(shù)據(jù)作為流式數(shù)據(jù)上傳。當然無論是什么文件格式,均可以。。。
下面是servlet 處理程序:
復制代碼 代碼如下:
//接收上傳文件內(nèi)容中臨時文件的文件名
String tempFileName = new String("tempFileName");
//tempfile 對象指向臨時文件
File tempFile = new File("D:/"+tempFileName);
//outputfile 文件輸出流指向這個臨時文件
FileOutputStream outputStream = new FileOutputStream(tempFile);
//得到客服端提交的所有數(shù)據(jù)
InputStream fileSourcel = request.getInputStream();
//將得到的客服端數(shù)據(jù)寫入臨時文件
byte b[] = new byte[1000];
int n ;
while ((n=fileSourcel.read(b))!=-1){
outputStream.write(b,0,n);
}
//關閉輸出流和輸入流
outputStream.close();
fileSourcel.close();
//randomFile對象指向臨時文件
RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");
//讀取臨時文件的第一行數(shù)據(jù)
randomFile.readLine();
//讀取臨時文件的第二行數(shù)據(jù),這行數(shù)據(jù)中包含了文件的路徑和文件名
String filePath = randomFile.readLine();
//得到文件名
int position = filePath.lastIndexOf('\\');
CodeToString codeToString = new CodeToString();
String filename = codeToString.codeString(filePath.substring(position,filePath.length()-1));
//重新定位讀取文件指針到文件頭
randomFile.seek(0);
//得到第四行回車符的位置,這是上傳文件數(shù)據(jù)的開始位置
long forthEnterPosition = 0;
int forth = 1;
while((n=randomFile.readByte())!=-1(forth=4)){
if(n=='\n'){
forthEnterPosition = randomFile.getFilePointer();
forth++;
}
}
//生成上傳文件的目錄
File fileupLoad = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file","upLoad");
fileupLoad.mkdir();
//saveFile 對象指向要保存的文件
File saveFile = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");
//找到上傳文件數(shù)據(jù)的結(jié)束位置,即倒數(shù)第四行
randomFile.seek(randomFile.length());
long endPosition = randomFile.getFilePointer();
int j = 1;
while((endPosition>=0)(j=4)){
endPosition--;
randomFile.seek(endPosition);
if(randomFile.readByte()=='\n'){
j++;
}
}
//從上傳文件數(shù)據(jù)的開始位置到結(jié)束位置,把數(shù)據(jù)寫入到要保存的文件中
randomFile.seek(forthEnterPosition);
long startPoint = randomFile.getFilePointer();
while(startPointendPosition){
randomAccessFile.write(randomFile.readByte());
startPoint = randomFile.getFilePointer();
}
//關閉文件輸入、輸出
randomAccessFile.close();
randomFile.close();
tempFile.delete();
其中CodeToString()方法是一個中文字符處理的方法。如果文件不進行編碼轉(zhuǎn)換,則上傳后的文件名將會是亂碼,接收的文件數(shù)據(jù)也會是亂碼:
下面是CodeToString()源代碼:
復制代碼 代碼如下:
//處理中文字符串的函數(shù)
public String codeString(String str){
String s = str;
try {
byte[] temp = s.getBytes("utf-8");
s = new String(temp);
return s ;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return s;
}
}
二:文件下載
實現(xiàn)文件下載的最簡單的方法就是使用超鏈接。假設在服務器上web目錄下地upload子目錄存在user.doc這個文檔。如:
a href="http://localhost:8080/upload/user.doc">下載user.doc/a>
當單擊這個超級鏈接時,將會在瀏覽器中直接打開這個文檔,就像是把word軟件嵌入在瀏覽器中一樣。
打開文檔后就可以實現(xiàn)另存為了。當然在web上,最常見的方式是單擊鏈接后,出現(xiàn)“另存為”對話框:
復制代碼 代碼如下:
//獲取要下載的文件名
String filename = request.getParameter("name");
//得到想客服端輸出的輸出流
OutputStream outputStream = response.getOutputStream();
//輸出文件用的字節(jié)數(shù)組,每次向輸出流發(fā)送600個字節(jié)
byte b[] = new byte[600];
//要下載的文件
File fileload = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);
//客服端使用保存文件的對話框
response.setHeader("Content-disposition", "attachment;filename="+filename);
//通知客服文件的MIME類型
response.setContentType("application/msword");
//通知客服文件的長度
long fileLength = fileload.length();
String length = String.valueOf(fileLength);
response.setHeader("Content_length", length);
//讀取文件,并發(fā)送給客服端下載
FileInputStream inputStream = new FileInputStream(fileload);
int n = 0;
while((n=inputStream.read(b))!=-1){
outputStream.write(b,0,n);
}
在該程序中,response對象的setContentType()用來定義服務器發(fā)送給客服端內(nèi)容的MIME類型。這里對MIME就不特別介紹了。事實上,凡是瀏覽器能處理的所有資源都有對應的MIME資源類型。在與服務器的交互中,瀏覽器就是對html、jsp等文件瀏覽器直接將其打開。對于word、excel等瀏覽器自身不能打開的文件則調(diào)用相應的方法。對于沒有標記MIME類型的文件。瀏覽器則根據(jù)其擴展名和文件內(nèi)容猜測其類型。。。
您可能感興趣的文章:- Jsp頁面實現(xiàn)文件上傳下載類代碼
- jsp中點擊圖片彈出文件上傳界面及預覽功能的實現(xiàn)
- Jsp+Servlet實現(xiàn)文件上傳下載 文件上傳(一)
- AJAX和JSP實現(xiàn)的基于WEB的文件上傳的進度控制代碼
- jsp文件上傳與下載實例代碼
- jsp中點擊圖片彈出文件上傳界面及實現(xiàn)預覽實例詳解
- 利用jsp+Extjs實現(xiàn)動態(tài)顯示文件上傳進度
- jsp 文件上傳瀏覽,支持ie6,ie7,ie8
- servlet+JSP+mysql實現(xiàn)文件上傳的方法
- JSP實現(xiàn)文件上傳功能