?? uploadservlet.java
字號:
package book.upload;
import java.io.*;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
//創建HttpSession對象
HttpSession session = request.getSession();
if ("status".equals(request.getParameter("c"))) {//如果請求中c的值為status
doStatus(session, response);//調用doStatus方法
} else {//否則,調用doFileUpload方法
doFileUpload(session, request, response);
}
}
public void processUploadedFile(FileItem item) {
//獲得上傳文件的文件名
String fileName = item.getName().substring(item.getName().lastIndexOf("\\") + 1);
//創建File對象,將上傳得文件保存到C:\\upload文件夾下
File file = new File("C:\\upload\\", fileName);
InputStream in;
try {
in = item.getInputStream();//獲得輸入數據流文件
//將該數據流寫入到指定文件中
FileOutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[4096]; // To hold file contents
int bytes_read;
while ((bytes_read = in.read(buffer)) != -1) // Read until EOF
{
out.write(buffer, 0, bytes_read);
}
if (in != null)
try {
in.close();
} catch (IOException e) {
;
}
if (out != null)
try {
out.close();
} catch (IOException e) {
;
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doPost(request, response);
}
private void doFileUpload(HttpSession session, HttpServletRequest request,
HttpServletResponse response) throws IOException {
try {
//創建UploadListener對象
UploadListener listener = new UploadListener(request.getContentLength());
listener.start();//啟動監聽狀態
//將監聽器對象的狀態保存在Session中
session.setAttribute("FILE_UPLOAD_STATS", listener.getFileUploadStats());
//創建MonitoredDiskFileItemFactory對象
FileItemFactory factory = new MonitoredDiskFileItemFactory(listener);
//通過該工廠對象創建ServletFileUpload對象
ServletFileUpload upload = new ServletFileUpload(factory);
//將轉化請求保存到list對象中
List items = upload.parseRequest(request);
//停止使用監聽器
listener.done();
boolean hasError = false;
//循環list中的對象
for (Iterator i = items.iterator(); i.hasNext();) {
FileItem fileItem = (FileItem) i.next();
processUploadedFile(fileItem);//調用processUploadedFile方法,將數據保存到文件中
fileItem.delete();//內存中刪除該數據流
}
}
if (!hasError) {//如果沒有出現錯誤
sendCompleteResponse(response, null);//調用sendCompleteResponse方法
} else {
sendCompleteResponse(response,
"Could not process uploaded file. Please see log for details.");
}
} catch (Exception e) {
sendCompleteResponse(response, e.getMessage());
}
}
private void doStatus(HttpSession session, HttpServletResponse response)
throws IOException {
// 設置該響應不在緩存中讀取
response.addHeader("Expires", "0");
response.addHeader("Cache-Control",
"no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.addHeader("Pragma", "no-cache");
//獲得保存在Session中的狀態信息
UploadListener.FileUploadStats fileUploadStats = (UploadListener.FileUploadStats) session.getAttribute("FILE_UPLOAD_STATS");
if (fileUploadStats != null) {
long bytesProcessed = fileUploadStats.getBytesRead();//獲得已經上傳的數據大小
long sizeTotal = fileUploadStats.getTotalSize();//獲得上傳文件的總大小
//計算上傳完成的百分比
long percentComplete = (long) Math.floor(((double) bytesProcessed / (double) sizeTotal) * 100.0);
//獲得上傳已用的時間
long timeInSeconds = fileUploadStats.getElapsedTimeInSeconds();
//計算平均上傳速率
double uploadRate = bytesProcessed / (timeInSeconds + 0.00001);
// 計算總共所需時間
double estimatedRuntime = sizeTotal / (uploadRate + 0.00001);
//將上傳狀態返回給客戶端
response.getWriter().println("<b>Upload Status:</b><br/>");
if (fileUploadStats.getBytesRead() != fileUploadStats.getTotalSize()) {
response.getWriter().println(
"<div class=\"prog-border\"><div class=\"prog-bar\" style=\"width: "
+ percentComplete + "%;\"></div></div>");
response.getWriter().println(
"Uploaded: " + bytesProcessed + " out of " + sizeTotal
+ " bytes (" + percentComplete + "%) "
+ (long) Math.round(uploadRate / 1024)
+ " Kbs <br/>");
response.getWriter().println(
"Runtime: " + formatTime(timeInSeconds) + " out of "
+ formatTime(estimatedRuntime) + " "
+ formatTime(estimatedRuntime - timeInSeconds)
+ " remaining <br/>");
} else {
response.getWriter().println(
"Uploaded: " + bytesProcessed + " out of " + sizeTotal
+ " bytes<br/>");
response.getWriter().println("Complete.<br/>");
}
}
//如果文件已經上傳完畢
if (fileUploadStats != null&& fileUploadStats.getBytesRead() == fileUploadStats.getTotalSize()) {
response.getWriter().println("<b>Upload complete.</b>");
}
}
private void sendCompleteResponse(HttpServletResponse response,
String message) throws IOException {
if (message == null) {
response.getOutputStream().print("<html><head><script type='text/javascript'>function killUpdate() { window.parent.killUpdate(''); }</script></head><body onload='killUpdate()'></body></html>");
} else {
response.getOutputStream().print("<html><head><script type='text/javascript'>function killUpdate() { window.parent.killUpdate('"
+ message+ "'); }</script></head><body onload='killUpdate()'></body></html>");
}
}
private String formatTime(double timeInSeconds) {
long seconds = (long) Math.floor(timeInSeconds);
long minutes = (long) Math.floor(timeInSeconds / 60.0);
long hours = (long) Math.floor(minutes / 60.0);
if (hours != 0) {
return hours + "hours " + (minutes % 60) + "minutes "
+ (seconds % 60) + "seconds";
} else if (minutes % 60 != 0) {
return (minutes % 60) + "minutes " + (seconds % 60) + "seconds";
} else {
return (seconds % 60) + " seconds";
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -