?? uploadservlet.java
字號(hào):
package book.upload;
import db.*;
import java.io.*;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.mysql.jdbc.ResultSet;
public class UploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
//創(chuàng)建HttpSession對(duì)象
HttpSession session = request.getSession();
if ("status".equals(request.getParameter("c"))) {//如果請(qǐng)求中c的值為status
doStatus(session, response);//調(diào)用doStatus方法
} else {//否則,調(diào)用doFileUpload方法
doFileUpload(session, request, response);
}
}
//上傳文件保存路徑為C:\\upload
String FilePath="D:\\upload";
String SFilePath="D:\\\\upload";
String sqlFirst="insert into file_data (Name,Programe,Source_Explain,User_Id,User_Name,Source_Time,Accessory_Local_Path,file_Sort,file_Name,file_NewName,file_Size,file_Time,url_info) values(";
String sqlEnd=")";
String sqlField,sqlFile;
//存儲(chǔ)獲得的唯一id號(hào)
String ISequenceId;
//生成唯一的id號(hào)
public String getSequenceId()
{
try {
String sqlSequenceId="select LAST_INSERT_ID()",sqlTemp="insert into sequence values()";
String Iid = null;
DBS Mconn=new DBS();
Mconn.executeUpdate(sqlTemp);
ResultSet rs=(ResultSet)Mconn.executeQuery(sqlSequenceId);
if(rs.next()){Iid=rs.getString(1);}
rs.close();
Mconn.sClose();
long Ltime=System.currentTimeMillis();
return ((""+Ltime)+Iid);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
//執(zhí)行拼接后的sql語(yǔ)句。
public void sqlExcute(String sql)
{
DBS Mconn=new DBS();
Mconn.executeUpdate(sql);
Mconn.sClose();
}
//返回當(dāng)前的時(shí)間字符串(格式化后的,可直接向數(shù)據(jù)庫(kù)插入)
public String getNewTime()
{
SimpleDateFormat myFmt=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = new Date();
return (myFmt.format(d).toString());
}
public void processUploadedField(List items)
{
//沒(méi)上傳一類文件就生成一次唯一Id
ISequenceId=getSequenceId();
//sql語(yǔ)句的values值
String SName="NULL",SPrograme="NULL",SExplain="NULL",SUser_Id="0",SUser_Name="NULL",SSource_Time=getNewTime(),SAccessory_Local_Path=SFilePath;
try {
for (Iterator i = items.iterator(); i.hasNext();)
{
FileItem item = (FileItem) i.next();
//獲得表單域名稱
String FieldName = item.getFieldName();
//獲得表單域值
String FieldValue = item.getString("GB2312");
if("name".equals(FieldName))
{
SName=FieldValue;
}else if("projectID".equals(FieldName))
{
SPrograme=FieldValue;
}else if("description".equals(FieldName))
{
SExplain=FieldValue;
}
item.delete();//內(nèi)存中刪除該數(shù)據(jù)流
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sqlField="'"+SName+"','"+SPrograme+"','"+SExplain+"',"+SUser_Id+",'"+SUser_Name+"','"+SSource_Time+"','"+SAccessory_Local_Path+"'";
}
public void processUploadedFile(List items)
{
String Sfile_Sort=ISequenceId,Sfile_Name,Sfile_Size,Sfile_Time=getNewTime(),Surl_info="NULL";
for (Iterator i = items.iterator(); i.hasNext();)
{
FileItem item = (FileItem) i.next();
//獲得上傳文件的文件名
String fileName = item.getName().substring(item.getName().lastIndexOf("\\") + 1);
if("".equalsIgnoreCase(fileName))continue;
//改名,使其在服務(wù)端名稱不沖突
String newName=""+ISequenceId+(new java.util.Random().nextInt(1000000))+fileName.substring(fileName.lastIndexOf("."));
Sfile_Name=fileName;
Sfile_Size=""+item.getSize();
//創(chuàng)建File對(duì)象,將上傳得文件保存
File file = new File(FilePath, newName);
InputStream in;
try {
in = item.getInputStream();//獲得輸入數(shù)據(jù)流文件
//將該數(shù)據(jù)流寫入到指定文件中
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) {
e.printStackTrace();
}
if (out != null)
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e1) {
e1.printStackTrace();
}
sqlFile=",'"+Sfile_Sort+"','"+Sfile_Name+"','"+newName+"','"+Sfile_Size+"','"+Sfile_Time+"','"+Surl_info+"'";
item.delete();//內(nèi)存中刪除該數(shù)據(jù)流
//組裝sql語(yǔ)句
String sql=sqlFirst+sqlField+sqlFile+sqlEnd;
//執(zhí)行sql語(yǔ)句
sqlExcute(sql);
}
}
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 {
//創(chuàng)建UploadListener對(duì)象
UploadListener listener = new UploadListener(request.getContentLength());
listener.start();//啟動(dòng)監(jiān)聽(tīng)狀態(tài)
//將監(jiān)聽(tīng)器對(duì)象的狀態(tài)保存在Session中
session.setAttribute("FILE_UPLOAD_STATS", listener.getFileUploadStats());
//創(chuàng)建MonitoredDiskFileItemFactory對(duì)象
FileItemFactory factory = new MonitoredDiskFileItemFactory(listener);
//通過(guò)該工廠對(duì)象創(chuàng)建ServletFileUpload對(duì)象
ServletFileUpload upload = new ServletFileUpload(factory);
//使用gb2312字符集
//upload.setHeaderEncoding("gb2312");
//將轉(zhuǎn)化請(qǐng)求保存到list對(duì)象中
List items = upload.parseRequest(request);
//停止使用監(jiān)聽(tīng)器
listener.done();
boolean hasError = false;
LinkedList field_item=new LinkedList(),file_item=new LinkedList();
//循環(huán)list中的對(duì)象
for (Iterator i = items.iterator(); i.hasNext();) {
FileItem fitem = (FileItem) i.next();
if (fitem.isFormField()) {//如果該FileItem是表單域
field_item.add(fitem);
}else if (!fitem.isFormField()) {//如果該FileItem不是表單域
file_item.add(fitem);
}
}
processUploadedField(field_item);//調(diào)用processUploadedField方法,將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中
processUploadedFile(file_item);//調(diào)用processUploadedFile方法,將數(shù)據(jù)保存到文件中
if (!hasError) {//如果沒(méi)有出現(xiàn)錯(cuò)誤
sendCompleteResponse(response, null);//調(diào)用sendCompleteResponse方法
} else {
sendCompleteResponse(response,
"Could not process uploaded file. Please see log for details.");
}
} catch (Exception e) {
sendCompleteResponse(response, "Error,please reload!");
System.out.println(e.getMessage());
}
}
private void doStatus(HttpSession session, HttpServletResponse response)
throws IOException {
// 設(shè)置該響應(yīng)不在緩存中讀取
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中的狀態(tài)信息
UploadListener.FileUploadStats fileUploadStats = (UploadListener.FileUploadStats) session.getAttribute("FILE_UPLOAD_STATS");
if (fileUploadStats != null) {
long bytesProcessed = fileUploadStats.getBytesRead();//獲得已經(jīng)上傳的數(shù)據(jù)大小
long sizeTotal = fileUploadStats.getTotalSize();//獲得上傳文件的總大小
//計(jì)算上傳完成的百分比
long percentComplete = (long) Math.floor(((double) bytesProcessed / (double) sizeTotal) * 100.0);
//獲得上傳已用的時(shí)間
long timeInSeconds = fileUploadStats.getElapsedTimeInSeconds();
//計(jì)算平均上傳速率
double uploadRate = bytesProcessed / (timeInSeconds + 0.00001);
// 計(jì)算總共所需時(shí)間
double estimatedRuntime = sizeTotal / (uploadRate + 0.00001);
//將上傳狀態(tài)返回給客戶端
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/>");
}
}
//如果文件已經(jīng)上傳完畢
if (fileUploadStats != null&& fileUploadStats.getBytesRead() == fileUploadStats.getTotalSize()) {
response.getWriter().println("<b>upfiles completed.</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";
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -