下载
- http://commons.apache.org/中有很多文档,可以直接阅读使用
我们需要上传下载功能,也能在官方文档查找到表单下载(推荐)
在web.xml中加局部变量,contentType内容类型
<servlet>
<description></description>
<display-name>FileuploadServlet</display-name>
<servlet-name>FileuploadServlet</servlet-name>
<servlet-class>cn.tedu.servlet.FileuploadServlet</servlet-class>
<init-param>
<param-name>contenttype</param-name>
<param-value>image/png;application/zip;text/plain;application/vnd.openxmlformats-officedocument.wordprocessingml.document</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FileuploadServlet</servlet-name>
<url-pattern>/FileuploadServlet.do</url-pattern>
</servlet-mapping>
加入表单,表单中选择文件,写说明,和一个上传按钮
<form method="POST"
enctype="multipart/form-data"
action="FileuploadServlet.do">
文件: <input type="file" name="upfile"><br/>
说明: <input type="text" name="note"><br/>
<br/>
<input type="submit" value="上传"> to upload the file!
</form>
servlet具体功能
FileuploadServlet.java
private List<String> fileTypes=new ArrayList<String>();//定义一个集合,里面是文件类型的字符串
初始化时,将xml中的变量读入,用分号分开,加到集合中
public void init() throws ServletException {
String contenttype=this.getInitParameter("contenttype");
String[] contenttypes=contenttype.split(";");
for(String ct:contenttypes){
fileTypes.add(ct);
}
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
// Check that we have a file upload request
// 检查我们有一个文件上传请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart){
//说明request中有一个文件
// Create a factory for disk-based file items
//创建一个磁盘文件条目工厂,工厂生产对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
//把request中的数据,转换成list集合,元素类型为fileItem
List<FileItem> items = upload.parseRequest(request);
// Process the uploaded items
//处理上传的条目
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
//是非文件域,除了文件之外的input
String name=item.getFieldName();//<input name>
String value=item.getString();//<input value>
System.out.println(name+" "+value);
if("note".equals(name)){
String noteValue=item.getString();
}
} else {
//是文件域<input type="file"processUploadFile(item)
String fieldName=item.getFieldName();
String fileName=item.getName();//获取真实文件名
String contentType=item.getContentType();//获取文件内容类型
boolean isInMemory=item.isInMemory();//是否在内存中
long sizeInBytes=item.getSize();//获取文件的长度
System.out.println(fieldName+" "+fileName+" "+contentType+" "+isInMemory+" "+sizeInBytes);
//处理获取真实的文件名,因为浏览器的差异,导致文件名前带有路径,用此功能去掉路径
if(fileName!=null){
fileName=FilenameUtils.getName(fileName);
}
if(fileTypes.contains(contentType)){
if(sizeInBytes<4194304){
//准备上传文件在服务器的存储路径
String realPath=this.getServletContext().getRealPath("/upload");
System.out.println(realPath);
File file=new File(realPath);
if(!file.exists()){
file.mkdir();
}
//把文件上传到upload文件夹
File uploadFile=new File(file,fileName);
item.write(uploadFile);//把文件写到具体路径
out.println("<div sty='color:red;'>上传文件成功</div>");
}else{
out.println("<div sty='color:red;'>文件太大</div>");
}
}else{
out.println("<div sty='color:red;'>文件类型不匹配</div>");
}
}
}
}
out.flush();
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
批量文件上传(表单提交)
上面实现了单文件上传,我们要实现多文件下载,通过js动态添加表单列表,实现多文件的下载,servlet不变,变量依然需要添加
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function addMore(){
var td_ele=document.getElementById("more");
var br_ele=document.createElement("br");
var input_file=document.createElement("input");
input_file.type="file";
input_file.name="upfile";
var input_button=document.createElement("input");
input_button.type="button";
input_button.value="删除";
//给删除按钮添加click事件
input_button.onclick=function(){
td_ele.removeChild(input_file);
td_ele.removeChild(input_button);
td_ele.removeChild(br_ele);
}
//把新建的对象挂载到dom文档树
td_ele.appendChild(br_ele);
td_ele.appendChild(input_file);
td_ele.appendChild(input_button);
}
</script>
</head>
<body>
<form action="FileuploadServlet.do" method="post" enctype="multipart/form-data"/>
<table border="1" align="center">
<tr>
<td>上传文件</td>
<td id="more">
<input type="file" name="upload">
<input type="button" value="添加..." onclick="addMore();">
</td>
</tr>
<tr>
<td>文件说明</td>
<td>
<input type="text" name="note"/>
</td>
</tr>
<tr>
<td colspan="2"></td>
<td>
<input type="submit" value="上传"/>
</td>
</tr>
</table>
</form>
</body>
文件上传ajax
<script type="text/javascript" src="js/common/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="js/common/ajaxfileupload.js"></script>
<script type="text/javascript" src="js/upload.js"></script>
<form id="formid">
上传文件: <input id="fileid" type="file" name="upfile"><br/>
文件说明 <input type="text" name="note"><br/>
文件说明 <input type="text" name="note1"><br/>
<br/>
<input type="submit" value="上传">
</form>
没有action,只有表单显示,引入了JavaScript,jquery,和别人写好的ajaxfileupload.js
$(function(){
$("#formid").submit(function(){
return upload_file();//false 终止html页面的表单提交,引申义就让submit方法提交
});
});
function upload_file(){
var note=$("#formid input[name=note]").val();
var note1=$("#formid input[name=note1]").val();
alert(note+" "+note1);
//ajax异步提交上传文件
$.ajaxFileUpload({
url:"/testmavenfileupload/FileuploadServlet_Ajax.do",
secureuri:false,//请求的路径不是一个安全的路径
fileElementId:"fileid",
type:"post",
dataType:"text",
data:{"n":note,"nn":note1},
success:function(data,status){
alert(data)
},
error:function(){
alert("请求失败!");
}
});
return false;
}
文件下载(普通文件)
<a href="DownLoadServlet.do?fileName=啊啊.png">啊啊.png</a>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取要下载的文件名
String fileName=request.getParameter("fileName");
//检测文件在服务器中是否存在
String realPath=this.getServletContext().getRealPath("/upload");
//拼装一个完整的路径
String allPath=realPath+File.separator+fileName;
System.out.println("allPath="+allPath);
File file=new File(allPath);
if(file.exists()){
//文件存在可以下载
//要想下载文件,必须给response对象设置一个消息头
response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1"));
//开始下载文件
OutputStream os=response.getOutputStream();
//先从服务器本地把文件读入到内存中
InputStream is=new FileInputStream(file);
byte[] buf=new byte[1024];
int len=-1;
while((len=is.read(buf))!=-1){
os.write(buf,0,len);
}
os.flush();
os.close();
is.close();
}
}
下载csv文件
<a href="DownLoadCSVServlet.do">下载csv格式文件</a>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename=download.csv");
OutputStream os=response.getOutputStream();
String csvText="";
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
csvText+=i*j+",";
}
csvText+="\n";
}
os.write(csvText.getBytes(),0,csvText.length());
os.flush();
os.close();
}