您的位置:首页 > 其它

servlet实现文件上传和下载

2008-10-27 10:06 423 查看
菜鸟学习中,希望大家能多提意见,看看我编程有哪些问题,什么都可以提。。。。

1.index.jsp中

<body>
<form name = "form1"action ="uploadservlet" method ="post" enctype="multipart/form-data">
文件上传:<input type ="file" name ="file1">
<input type ="submit" value ="开始上传">
</form>
<form name ="form2" action ="selectservlet" method ="post">
文件名:<input type ="text" name ="text"/>
<input type ="submit" value ="查询">
</form>
</body>

点击“开始上传”时,提交FORM表单,根据uploadservlet在web.XML中的配置找到相应的servlet

2.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>uploadservlet</servlet-name>
<servlet-class>allservlet.uploadservlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>uploadservlet</servlet-name>
<url-pattern>/uploadservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>selectservlet</servlet-name>
<url-pattern>/selectservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>downloadservlet</servlet-name>
<url-pattern>/downloadservlet</url-pattern>
</servlet-mapping>

3.uploadservlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("!!!!上传开始!!!!!!!!action");
response.setCharacterEncoding("gb2312");
boolean bool = false;
PrintWriter out=response.getWriter();
try {
DiskFileUpload fu = new DiskFileUpload();

// 设置允许用户上传文件大小,单位:字节,这里设为2m
fu.setSizeMax(2*1024*1024);
// 设置最多只允许在内存中存储的数据,单位:字节
fu.setSizeThreshold(4096);
// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
fu.setRepositoryPath("c://windows//temp");
//开始读取上传信息
List fileItems = null;
try {
fileItems = fu.parseRequest(request);
} catch (FileUploadException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 依次处理每个上传的文件
Iterator iter = fileItems.iterator();

// 正则匹配,过滤路径取文件名
String regExp=".+////(.+)$";

// 过滤掉的文件类型
String[] errorType={".exe",".com",".cgi",".asp"};
// java.util.regex.Pattern是正则表达式编译后的表达法
//下面的语句将创建一个Pattern对象并赋值给句柄p
//Pattern 不能被new出来
Pattern p = Pattern.compile(regExp);
while (iter.hasNext()) {
FileItem item = (FileItem)iter.next();
//忽略其他不是文件域的所有表单信息
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
System.out.println("文件名:"+name+"长度:"+size);
if((name==null||name.equals("")) && size==0)
continue;
//p.matcher(str)表示以用模板p去生成一个字符串str的匹配器,它的返回值是一个Matcher类的引用
Matcher m = p.matcher(name);
boolean result = m.find();
System.out.println("Matcher m测试m.group(1)是什么意思:m.group(1)="+m.group(1));
System.out.println("Matcher m测试m.group(0)是什么意思:m.group(0)="+m.group(0));
if (result){
for (int temp=0;temp<errorType.length;temp++){
if (m.group(1).endsWith(errorType[temp])){
throw new IOException(name+": wrong type");
}
}
try{

// 保存上传的文件到指定的目录

// 在下文中上传文件至数据库时,将对这里改写
item.write(new File("d://" + m.group(1)));
System.out.println("上传结束");
accessDB adb =new accessDB();
bool = adb.insertSQL(m.group(1),size);

out.print(name+"  "+size+"<br>");
}
catch(Exception e){
out.println(e);
}

}
else
{
throw new IOException("fail to upload");
}
}
}
}finally{

}
if(bool=true){
RequestDispatcher rd =request.getRequestDispatcher("/uploadsuccess.jsp");
rd.forward(request, response);
}
}

上传功能完成,并把文件信息放入了DB中,已Mysql为例:

package dbconnection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Date;

import javabean.All_file;

import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement;

public class accessDB {
Connection conn =null;
Statement sta =null;
public accessDB() throws ClassNotFoundException, SQLException{
Class.forName("com.mysql.jdbc.Driver");
String userName ="root";
String password ="root";
String url ="jdbc:mysql://localhost:3306/upload_db";
conn=DriverManager.getConnection(url,userName,password);
conn.setAutoCommit(false);
sta =(Statement) conn.createStatement();
}

public String selectById(int id){
System.out.println("11111");
String sql ="select file_name from all_file where file_id = "+id+"";
System.out.println("22222");
String name ="";
ResultSet res =null;
try {
res = (ResultSet) sta.executeQuery(sql);
// if(res==null){
// System.out.println("没有结果");
// }
while(res.next()&&res!=null){
name =res.getString("file_name");
System.out.println(name);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return name;
}

public boolean insertSQL(String name,long size){
boolean bool =false;
String sql ="insert into all_file(file_name,file_size)values('"+name+"', "+size+")";
try {
bool = sta.execute(sql);
conn.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bool;
}

public All_file[] selectSQL(String name){
String sql ="select * from all_file where file_name like '%"+name+"%'" ;
ResultSet res =null;
All_file[] afile =null;
try {
res = (ResultSet) sta.executeQuery(sql);
res.last();
int i=0;
int j =res.getRow();
System.out.println("数组的长度:"+j);
afile = new All_file[j];
res.first();
System.out.println("回复:"+res.getRow());
//res.first();
//int i =res.getRow();
//System.out.println("i的值:"+i);
//res.next();
//System.out.println(res.getRow());
System.out.println("~~~~~~~~~");
while(i<j){
System.out.println("i的值:"+i+"file_id:"+res.getInt("file_id")+"file_name:"+res.getString("file_name")+"file_size:"+res.getInt("file_size"));
afile[i] = new All_file(res.getInt("file_id"),res.getString("file_name"),res.getInt("file_size"));
i++;
res.next();
}
/*
while(res!=null&&res.next()){
afile =new All_file(res.getInt("file_id"),res.getString("file_name"),res.getInt("file_size"));
}*/
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return afile;
}
}

查询到页面上后,自动生成表格,选择一项进行下载:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int fileid =0;
if(request.getParameter("radio")==null){
fileid =0;
}else{
fileid =Integer.parseInt(request.getParameter("radio"));
}
System.out.println("根据id查询name的id="+fileid);
String fileName = null;
accessDB adb = null;
try {
adb = new accessDB();
fileName = adb.selectById(fileid);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("查询出的文件名:"+fileName);

String path ="d:/";
// response.setContentType(" text/plain ");
// OutputStream outputStream = null;
// try {
// outputStream = response.getOutputStream();
// //把文件路径为srcFile的文件写入outputStream中
// popFile(path, outputStream) ;
// } catch (IOException e) {
// e.printStackTrace();
// }
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment;filename=/""+fileName + "/"");

// 打开指定文件的流信息
java.io.FileInputStream fileInputStream = new java.io.FileInputStream(path + fileName);

// 写出流信息
int i;
OutputStream out = response.getOutputStream();
while((i=fileInputStream.read())!=-1) {
out.write(i);
}
fileInputStream.close();
out.close();
}

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