上传文件是web项目的基本功能,一般来说,客户没有特别的要求,但有时候也会遇到问题。我原来的项目中用的是jspsmart上传组件,上传小文件没有问题,上传大文件就特别慢,速度只有10-40k/s,客户要求我们提高上传速度。
经过在网上查询,
发现有人推荐cos上传组件。我做了一个测试页面。
在网上下载cos组件后,解压,将lib目录下的cos.jar加入项目lib中。
做个上传的页面upload.html。
代码很简单。如下:
<html>
<head>
<title>文件上传测试</title>
</head>
<body>
<form method="post" action="cos.jsp" enctype="multipart/form-data" >
公司文件上传测试<br/>
请选择文件:<input type="file" name="file" id="file" size="80" />
<input type="submit" value="上传" />
</form>
</body>
</html>
后台cos.jsp页面:
<%@page contentType="text/html;charset=GBK"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@page import="javax.servlet.
ServletContext"%>
<%@page import="com.oreilly.servlet.multipart.FileRenamePolicy"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.io.*"%>
<%@page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件上传测试</title>
</head>
<body>
<%
String saveDir = "d:/javaupload/";
int maxPostSize = 300*1024*1024;//最大上传300MB
String encoding = "GBK";
long start;
long end;
long result;
float fileSize;
float perSendSize;
start=System.currentTimeMillis();
MultipartRequest multi = null;
try{
multi = new MultipartRequest(request ,
saveDir , maxPostSize , encoding);
}catch(IOException e){
//上传大小超过maxPostSize就会出现IOException
out.println("请确认上传文件不超过300M!");
//out.println(e.getMessage());
return;
}
//
获取文件信息
Enumeration fileNames = multi.getFileNames();
while(fileNames.
hasMoreElements()){
//指表单中的name值
String name = (String)fileNames.nextElement();
String
original = multi.getOriginalFileName(name);
if(original == null)
continue;
String sysname = multi.getFile
systemName(name);
//String type = multi.getContentType(name);
end = System.currentTimeMillis();
result = (end-start)/1000;
File file = multi.getFile(name);
//File file = new File(saveDir + sysname);
long length = file.length();
fileSize = (float)length/1024/1024;
if(result==0)result=1;
perSendSize = fileSize/result;
out.println("<font color='blue'>谢谢您参与测试!测试数据已记录</font><br />" );
//request.getHeader( "user-agent ")
// out.println(request.getHeader("user-agent"));
out.println("您的IP地址是 :<font color='red'>" + request.getRemoteAddr() +"</font><br />");
out.println("您上传的原
文件名称:<font color='red'>" + original +"</font><br />");
out.println("上传到服务器上的文件全名称:<font color='red'>" + saveDir + sysname +"</font><br />");
out.println("上传到服务器上的文件大小<font color='red'>:" + String.valueOf(fileSize) +"M</font><br />");
out.println("上传用时:<font color='red'>" + String.valueOf(result) +"秒</font><br />");
out.println("平均上传速度:<font color='red'>" + String.valueOf(perSendSize) +"M/秒</font><br />");
// out.println("文件类型:" + type +"<br /><br />");
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat format2=new SimpleDateFormat("yyyy-MM-dd");
String logFile = "d:/javaupload/log/" +format2.format(new Date())+"_log.txt";
FileWriter writer = new FileWriter(logFile, true);
writer.write("\r\n===========================================================================\r\n");
writer.write(format.format(new Date())+"\r\n");
writer.write("您的IP地址是 : " + request.getRemoteAddr());
writer.write("\r\n您上传的原文件名称: " + original );
writer.write("\r\n上传到服务器上的文件全名称:" + saveDir + sysname);
writer.write("\r\n上传到服务器上的文件大小:" + String.valueOf(fileSize) +"M");
writer.write("\r\n上传用时:" + String.valueOf(result) +"秒");
writer.write("\r\n平均上传速度:" + String.valueOf(perSendSize) +"M/秒");
writer.write("\r\n===========================================================================\r\n");
writer.close();
writer=null;
}
%>
<br>
<input name="submit2" type="button" value="返回" onClick="window.location='upload.html'">
</body>
</html>
后台代码主要是上传文件,记录上传文件信息,速度到日志文件,方便查看测试结果。
部署在客户服务器上后,测试的结果客户非常满意。最慢的机子速度能达到500k/s,一般的机子都能达到1m/s以上,最给力的是谷歌浏览器和火狐浏览器,能达到10m/s。表现最次的是
360浏览器,30k/s,真滥。