⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uploadservlet.java

📁 对上传文件有进度条的源码的改进
💻 JAVA
字号:
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 {

        //创建HttpSession对象
		HttpSession session = request.getSession();

		if ("status".equals(request.getParameter("c"))) {//如果请求中c的值为status
			doStatus(session, response);//调用doStatus方法
		} else {//否则,调用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;

	//存储获得的唯一id号
	String ISequenceId;
	//生成唯一的id号
	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;
		}
		
	}
	
	//执行拼接后的sql语句。
	public void sqlExcute(String sql)
	{		
		DBS Mconn=new DBS();
		Mconn.executeUpdate(sql);
		Mconn.sClose();
	}
	
	//返回当前的时间字符串(格式化后的,可直接向数据库插入)
	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)
	{	
		//没上传一类文件就生成一次唯一Id
		ISequenceId=getSequenceId();
		//sql语句的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();//内存中删除该数据流
		}
		} 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;
			//改名,使其在服务端名称不冲突
			String newName=""+ISequenceId+(new java.util.Random().nextInt(1000000))+fileName.substring(fileName.lastIndexOf("."));
			
			
			Sfile_Name=fileName;
			Sfile_Size=""+item.getSize();
			//创建File对象,将上传得文件保存
			File file = new File(FilePath, newName);

			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) {
						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();//内存中删除该数据流
			//组装sql语句
			String sql=sqlFirst+sqlField+sqlFile+sqlEnd;
			//执行sql语句
			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 {
			//创建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);
			
			//使用gb2312字符集
			//upload.setHeaderEncoding("gb2312");
			
			//将转化请求保存到list对象中			
			List items = upload.parseRequest(request);
			//停止使用监听器
			listener.done();
			boolean hasError = false;
			
			LinkedList field_item=new LinkedList(),file_item=new LinkedList();
			//循环list中的对象
			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);//调用processUploadedField方法,将数据保存到数据库中
				
			
			processUploadedFile(file_item);//调用processUploadedFile方法,将数据保存到文件中
				

			if (!hasError) {//如果没有出现错误
				sendCompleteResponse(response, null);//调用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 {
		// 设置该响应不在缓存中读取
		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>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";
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -