您的位置:首页 > 其它

文件的上传和下载

2016-04-17 15:48 429 查看
最简单的下载就是在< a>标签里指向文件的地址。

下面这个是最简单的文件上传

还有下载

这里用到了连个jar包,分别是

commons-fileupload-1.3.jar

commons-io-2.4.jar

(我把他们上传到我的资源里了)

Upload.java

package com.bright;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

public class Upload extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

String path=this.getServletContext().getRealPath("/uploads");

String msg="ok";

//1.创建上传组件的工厂类
DiskFileItemFactory factory =new DiskFileItemFactory();

//2.获取上传组件
ServletFileUpload upload =new ServletFileUpload(factory);

//3.从请求对象中获取数据
try {
List<FileItem> list=upload.parseRequest(req);
Iterator<FileItem> it=list.iterator();

//4.遍历集合处理请求中的数据
while(it.hasNext()){
FileItem item=it.next();

//5.判断是否是文件
if(item.isFormField()){
System.out.println(item.getString());
}else {

//是文件
//6.上传文件
String filename=item.getName();

InputStream in=item.getInputStream();

//7.将输入流通过输出流写在服务器的硬盘上
File file=new File(path,filename);

OutputStream outputStream=new FileOutputStream(file);

//8.使用IOUtils复制文件
IOUtils.copy(in, outputStream);
System.out.println(filename);

//注意最后记得要关闭输出流和输入流
in.close();
outputStream.close();
}

}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
msg="sorry!";
}

System.out.println(msg);

//注意上传的文件是在服务器里--tomcat中,从下面的地址就可以看出文件的地址
System.out.println(path);

}

}


upload.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'upload.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
<div style="margin:auto;">
<h1>文件上传测试</h1>
<form action="upload" method="post" enctype="multipart/form-data">
上传文字:<input type="text" name="info">
上传文件:<input type="file" name="file">
<input type="submit">

</form>

</div>
</body>
</html>


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>com.bright.Upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>

</web-app>


2.下面是将上传功能稍微完善下

upload2.java

package com.bright;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

public class Upload2 extends HttpServlet  {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

req.setCharacterEncoding("utf8");

//文件上传
//准备工作(找到上传的目录)
String path = this.getServletContext().getRealPath("/uploads");
String tmp = this.getServletContext().getRealPath("/tmp");//临时目录
String msg = "";

//1.创建上传组件的工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(tmp));   //设置临时目录
factory.setSizeThreshold(1024*1024);    //设置缓冲区大小  1M

//2.获取上传组件
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(1024*1024*100); //上传文件最大10M
/*
MyProgressListener lis = new MyProgressListener();

upload.setProgressListener(lis);
*/
/*
* 文件上传的进度
*
*/

//3.从请求对象中获取数据
try {
List<FileItem> list = upload.parseRequest(req);

//4.遍历集合处理请求中的数据
Iterator<FileItem> it = list.iterator();

while(it.hasNext()){
//每一个表单提交的内容
FileItem item = it.next();

//5.判断是否是文件
if(item.isFormField()){
//不是文件
System.out.println(item.getFieldName()+" : "+item.getString());

}else{
//是文件
//6.上传文件
String fileName = item.getName();  //文件名
InputStream in = item.getInputStream(); //内容

//7.将输入流通过输出流写在服务器的硬盘上
/*
* 文件名一般由程序生成 UUID 生成一个唯一的字符串作为名字
* 目录:根据日期来分散存放以日期命名的文件夹中
*
* 存入数据库
*  ID,UUIDfile(服务器硬盘上的文件名),fileName(上传的时候叫什么名字),uploadtime,info...
*/

File file = new File(path, fileName);

OutputStream out = new FileOutputStream(file);

//8.使用IOUtils复制文件
IOUtils.copy(in, out);

in.close();
out.close();
}

}

msg = "恭喜你上传成功了!";
}catch(FileSizeLimitExceededException e){
e.printStackTrace();
msg = "上传失败,最大只能上传10M!<a href='upload.jsp'>重新上传</a>";
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
msg = "对不起,上传失败!<a href='upload.jsp'>重新上传</a>";
}

req.setAttribute("msg", msg);
req.getRequestDispatcher("/upload.jsp").forward(req, resp);
System.out.println(msg);
}

}


二,文件的下载

download.java

//    <a href="download?filename=12.txt">点击这里下载</a>
/*<servlet>
<servlet-name>download</servlet-name>
<servlet-class>com.bright.Download</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
*/

package com.bright;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

import sun.misc.BASE64Decoder;

public class Download extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取文件的信息
String filename=req.getParameter("filename");

filename=new String(filename.getBytes("iso-8859-1"),"utf-8");
String path=this.getServletContext().getRealPath("/uploads");

InputStream in=new FileInputStream(new File(path,filename));

//判断用户现在拿什么浏览器在下载
String usemsg=req.getHeader("User-Agent");

if(usemsg.indexOf("MSIE")>0){
//IE浏览器
}else{
//其他浏览器
}

//设置response,告诉浏览器不要直接显示
resp.setContentType("application/x-msdownload");

//(处理下载文件显示的文件名)
filename=URLEncoder.encode(filename,"utf-8");

resp.addHeader("Content-Disposition","attachment;filename=" + filename);
//向浏览器输出流对象
OutputStream out=resp.getOutputStream();

IOUtils.copy(in, out);

in.close();
out.close();

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: