一、文件上传
文件的上传也是基于表单来完成的,表单中的file元素可以自动生成一个文本框和一个按钮,文本框可以输入本地文件名或路径,点击按钮则可以打开一个文件选择框让用户选中本地文件。需要注意的是在文件上传时还必须设置表单的enctype属性,并将它的值设置为multipart/form-data。
upload.jsp
<form method="post" enctype="multipart/form-data"
action="smartupladservlet.do">
<input type="text" name="username"><br>
<input type="file" name="myfile"><br>
<input type="file" name="myfile2"><br>
<input type="file" name="myfile3"><br>
<input type="submit" value="上传">
</form>
</body>
这里使用的是smartupload,需要该包。
上传文件的servlet
import java.io.file;
import java.io.ioexception;
import java.io.printwriter;
import java.sql.sqlexception;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import com.jspsmart.upload.smartupload;
import com.jspsmart.upload.smartuploadexception;
public class smartupladservlet extends httpservlet {
public smartupladservlet() {
super();
}
public void destroy() {
super.destroy();
public void doget(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {
//文件上传个数
int count = 0;
//文件上传地址
string filepath = getservletcontext().getrealpath("/")+"smartupload";
//如果文件夹不存在 则创建这个文件夹
file file = new file(filepath);
if(!file.exists())
{
file.mkdir();
}
//初始化对象
smartupload su = new smartupload();
su.initialize(getservletconfig(),request,response);
//设置文件最大容量
su.setmaxfilesize(10*1024*1024);
//设置所有文件最大容量
su.settotalmaxfilesize(100*1024*1024);
//设置上传文件类型
su.setallowedfileslist("rar,txt,jpg,bmp,gif");
try {
//设置禁止上传的文件类型
su.setdeniedfileslist("jsp,js,html,css");
//上传文件
su.upload();
system.out.println("username=" + su.getrequest().getparameter("username"));
count = su.save(filepath);
}
catch (sqlexception e) {
e.printstacktrace();
catch (smartuploadexception e) {
for (int i = 0; i < su.getfiles().getcount(); i++) {
com.jspsmart.upload.file tempfile = su.getfiles().getfile(i);
system.out.println("表单项名称:" + tempfile.getfieldname());
system.out.println("文件名:" + tempfile.getfilename());
system.out.println("文件长度:" + tempfile.getsize());
system.out.println("文件扩展名:" + tempfile.getfileext());
system.out.println("文件全名:" + tempfile.getfilepathname());
system.out.println("上传成功!共" + count + "个文件!");
public void dopost(httpservletrequest request, httpservletresponse response)
doget(request,response);
public void init() throws servletexception {
}
web.xml文件配置
<servlet>
<description>this is the description of my j2ee component</description>
<display-name>this is the display name of my j2ee component</display-name>
<servlet-name>smartupladservlet</servlet-name>
<servlet-class>com.kay.servlet.smartupladservlet</servlet-class>
</servlet>
<servlet-mapping>
<url-pattern>/smartupladservlet.do</url-pattern>
</servlet-mapping>
二、文件下载
通过超链接下载文件,会暴露了下载文件在服务器中的真实地址,不利于对资源进行安全保护,而且利用超链接下载文件,服务器端得文件只能存放在web应用程序所在的目录下。利用程序编码实现下载,可以增加安全机制,比如我们只能让vip会员下载等等。还可以从任意位置进行下载,我们可以将文件放到web应用程序外的目录中。
显示文件夹内所有文件的servlet
import java.util.arraylist;
import java.util.list;
public class showfileservlet extends httpservlet {
string path = "c:/file";
//声明集合存放目录下所有文件的文件名
list<string> filelist = new arraylist<string>();
file folder = new file(path);
//判断文件夹是否存在并且是否是一个目录
if(folder.exists() && folder.isdirectory()){
//获得目录中所有文件及目录
file[] files = folder.listfiles();
for (file file : files) {
//如果是文件
if(file.isfile()){
//将文件名放入集合中
filelist.add(file.getname());
}
}
request.setattribute("filelist", filelist);
request.getrequestdispatcher("showfile.jsp").forward(request, response);
showfile.jsp
<%@ page language="java" pageencoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en">
<html>
<head>
<title>显示所有文件</title>
</head>
<body>
请选择您要下载的文件:<br/>
<c:foreach items="${filelist}" var="filename">
<a href="downloadservlet?filename=${filename }">${filename }</a><br/>
</c:foreach>
</body>
</html>
下载文件的downloadservlet
import java.io.bufferedinputstream;
import java.io.bufferedoutputstream;
import java.io.fileinputstream;
import java.io.inputstream;
import javax.servlet.servletoutputstream;
public class downloadservlet extends httpservlet {
string filename = request.getparameter("filename");
file file = new file(path + "/" + filename);
//如果文件存在
if (file.exists()) {
//设置响应类型及响应头
response.setcontenttype("application/x-msdownload");
response.addheader("content-disposition", "attachment; filename=\""
+ filename + "\"");
//读取文件
inputstream inputstream = new fileinputstream(file);
bufferedinputstream bis = new bufferedinputstream(inputstream);
byte[] bytes = new byte[1024];
servletoutputstream outstream = response.getoutputstream();
bufferedoutputstream bos = new bufferedoutputstream(outstream);
int readlength = 0;
while ((readlength = bis.read(bytes)) != -1) {
bos.write(bytes, 0, readlength);
//释放资源
inputstream.close();
bis.close();
bos.flush();
outstream.close();
bos.close();
doget(request, response);
原帖地址:http://blog.sina.com.cn/s/blog_60f823dd01017nz9.html