使用Servlet獲取上傳文件的輸入流然後再解析裏面的請求參數。
一、 Jsp頁面
post方式提交,enctype爲”multipart/form-data”。
<body>
<form action="uploadServlet.do" method="post" enctype="multipart/form-data">
<input type="file" id="myfile" name="myfile">
<input type="submit" value="提交">
<br>
${result}
<br>
下載:<a href="downloadServlet.do?filename=file.txt">file.txt</a>
<br>
${errorResult}
</form>
</body>
二、 創建文件上傳Servlet
上傳的文件無法直接保存,需創建一個臨時文件,獲取上傳文件輸入流信息,將文件輸出流指向臨時文件。從臨時文件獲取上傳文件名、文件內容開始與結束指針,設置文件上傳的路徑,臨時文件將文件內容輸出到保存文件。
package com.yf.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("已接收到請求 ");
//從request當中獲取流信息
InputStream fileSource = request.getInputStream();
String tempFileName = "E:/tempFile";
//tempFile指向臨時文件
File tempFile = new File(tempFileName);
//outputStream文件輸出流指向這個臨時文件
FileOutputStream outputStream = new FileOutputStream(tempFile);
byte b[] = new byte[1024];
int n;
while((n=fileSource.read(b))!=-1){
outputStream.write(b,0,n);
}
//關閉輸出流輸入流
outputStream.close();
fileSource.close();
//獲取上傳文件的名稱
RandomAccessFile randomFile = new RandomAccessFile(tempFile, "r");
randomFile.readLine();//第一行不要
//獲取第二行
String str = randomFile.readLine();
int benginIndex = str.lastIndexOf("=")+2;
int endIndex = str.lastIndexOf("\"");
String fileName = str.substring(benginIndex,endIndex);
System.out.println("文件名"+fileName);
//重新定位文件指針到文件頭
randomFile.seek(0);
long startPosition = 0;
int i = 1;
while((n = randomFile.readByte())!= -1 &&i <= 4){
if(n == '\n'){
//重新獲取文件指針
startPosition = randomFile.getFilePointer();
i++;
}
}
startPosition -=1;
//獲取文件內容結束位置
//定位指針到文件結尾
randomFile.seek(randomFile.length());
long endPosition = randomFile.getFilePointer();
int j = 1;
while(endPosition >= 0 && j<=2){
endPosition--;
randomFile.seek(endPosition);
if(randomFile.readByte() == '\n'){
j++;
}
}
endPosition -= 1;
//設置保存文件的路徑
String realPath = getServletContext().getRealPath("/")+"images";
File fileupload = new File(realPath);
if(!fileupload.exists()){
//不存在創建
fileupload.mkdir();
}
File saveFile = new File(realPath,fileName);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile, "rw");
//從臨時文件當中讀取文件內容
randomFile.seek(startPosition);
while(startPosition < endPosition){
randomAccessFile.write(randomFile.readByte());
startPosition = randomFile.getFilePointer();
}
//關閉輸入輸出流,刪除臨時文件
randomAccessFile.close();
randomFile.close();
tempFile.delete();
request.setAttribute("result", "上傳成功");
RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
dispatcher.forward(request, response);
}
}
三、創建 文件下載Servlet
package com.yf.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取文件下載路徑
String path = getServletContext().getRealPath("/")+"images/";
String filename = request.getParameter("filename");
File file = new File(path+filename);
if(file.exists()){
//設置相應類型application/octet-stream
response.setContentType("application/x-msdownload");
//設置頭信息
response.setHeader("Content-Disposition", "attachment;filename=\""+filename+"\"");
//讀取文件
InputStream inputStream = new FileInputStream(file);
ServletOutputStream outputStream = response.getOutputStream();
byte b[] = new byte[1024];
int n;
while((n = inputStream.read(b))!=-1){
outputStream.write(b,0,n);
}
//關閉流
outputStream.close();
inputStream.close();
}else{
request.setAttribute("errorResult", "文件不存在下載失敗");
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
}
四、 運行結果
選擇上傳文件:
點擊提交
在tomcat下保存文件,頁面顯示上傳成功。
點擊下載,如果文件存在,則下載。不存在顯示下載失敗。