文件上传(servlet 中含下载和删除操作)
2008-02-15 23:12
537 查看
个人认为,文件上传是一个较为独立的功能,有一定的统一性和规范性。因此,将它记录下来。
一般来说,文件上传的方法很多,可以应用商业javabean(如jspsmartupload),也可以用开源javabean(如Apache Commons FileUpload),或者独立更生,写一个自己的bean,这里我选择用开源bean,原因有二:1、免费,可扩展;2、功能一般较为完善和规范,省时省力。
以下是实现文件上传的一个实例,该实例的环境如下:
1、MSSQL 数据库
2、Ibatis做存储模式
一、数据库
CREATE TABLE [dbo].[attachment](
[Sequence] NUMERIC(10,0) IDENTITY(1,1) NOT NULL,
[ObjectID] NUMERIC(10,0) NULL,
[ObjectName] VARCHAR(256) NULL,
[FileName] VARCHAR(512) NULL,
[FileSize] INT NULL,
[FileData] IMAGE NULL,
CONSTRAINT [PK_attachment] PRIMARY KEY CLUSTERED ([Sequence])
)
二、POJO 类
public class Attachment ...{
private int sequence;
private int objectId;
private String objectName;
private String fileName;
private int fileSize;
private byte[] fileData;
public byte[] getFileData() ...{
return fileData;
}
public void setFileData(byte[] fileData) ...{
this.fileData = fileData;
}
public String getFileName() ...{
return fileName;
}
public void setFileName(String fileName) ...{
this.fileName = fileName;
}
public int getObjectId() ...{
return objectId;
}
public void setObjectId(int objectId) ...{
this.objectId = objectId;
}
public String getObjectName() ...{
return objectName;
}
public void setObjectName(String objectName) ...{
this.objectName = objectName;
}
public int getSequence() ...{
return sequence;
}
public void setSequence(int sequence) ...{
this.sequence = sequence;
}
public int getFileSize() ...{
return fileSize;
}
public void setFileSize(int fileSize) ...{
this.fileSize = fileSize;
}
}
开始字段fileData 用了java.sql.Blob类型,后发现将InputStream转成Blob类型时较为棘手,所以专用了byte[]类型,不过也有办法,我想可以自己写个Blob类以实现,java.sql.Blob 这个接口。
三、SQLMap XML
<resultMap id="attachmentResult" class="attachment">
<result property="sequence" column="SEQUENCE" nullValue="0"/>
<result property="objectId" column="OBJECTID" nullValue="0"/>
<result property="objectName" column="OBJECTNAME" nullValue=""/>
<result property="fileName" column="FILENAME" nullValue=""/>
<result property="fileSize" column="FILESIZE" nullValue="0"/>
<result property="fileData" column="FILEDATA" />
</resultMap>
<insert id="insertAttachment" parameterClass="attachment">
INSERT INTO ATTACHMENT (
OBJECTID,
OBJECTNAME,
FILENAME,
FILESIZE,
FILEDATA
)VALUES(
#objectId#,
#objectName:VARCHAR#,
#fileName:VARCHAR#,
#fileSize#,
#fileData#
)
<selectKey resultClass="int" keyProperty="sequence">
<!-- SELECT SCOPE_IDENTITY() AS SEQUENCE -->
SELECT @@IDENTITY AS SEQUENCE
</selectKey>
</insert>
这里需要注意的是采用selectKey自动生成id时没有一个十全十美的办法,Ibatis官方网站有所讨论,具体参见 http://www.mail-archive.com/user-cs@ibatis.apache.org/msg01993.html 四、Implement 类
public class AttachmentDaoImpl ...{
public static Integer insert(Attachment attachment) throws SQLException ...{
try ...{
return (Integer) IbatisHelper.getSqlMapper().insert(
"insertAttachment", attachment);
} catch (SQLException e) ...{
e.printStackTrace();
return null;
}
}
}
五、Servlet
/** *//**
* Servlet implementation class for Servlet: UploadFile
*
*/
public class UploadFile extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet ...{
/** *//**
*
*/
private static final long serialVersionUID = 1L;
private static final String CONTENT_TYPE = "text/html;charset=gb2312";
private static final String TEMP_PATH = "c:/windows/temp";
private static final String DESTINATION_PATH = "/attachment/";
private static final int MAX_MEMORY_SIZE = 2*1024*1024;
private static final int MAX_REQUEST_SIZE = 3*1024*1024;
private String fileName = "";
public String processUploadedFile(FileItem item)...{
boolean writeToFile = false;
// Process a file upload
if (writeToFile) ...{
File uploadedFile = new File(DESTINATION_PATH);
try ...{
item.write(uploadedFile);
return "";
} catch (Exception e) ...{
e.printStackTrace();
return "Error:Write to file system failed.";
}
} else ...{
try ...{
InputStream uploadedStream = item.getInputStream();
byte[] b = new byte[uploadedStream.available()];
int fileSize = b.length;
uploadedStream.read(b);
uploadedStream.close();
Attachment attachment = new Attachment();
attachment.setFileName(fileName);
attachment.setFileSize(fileSize);
attachment.setFileData(b);
try...{
Integer key = AttachmentDaoImpl.insert(attachment);
return key.toString();
}catch(SQLException e)...{
e.printStackTrace();
return "Error:Write to database failed.";
}
} catch (IOException e) ...{
e.printStackTrace();
return "Error:I/O write failed.";
}
}
}
public String processFormField(FileItem item)...{
String fieldName = item.getFieldName();
if("FileName".equals(fieldName))
fileName = item.getString();
return "";
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ...{
response.setContentType(CONTENT_TYPE);
String action = request.getParameter("action");
String strId = request.getParameter("id");
if(null==strId||"".equals(strId)) ...{
PrintWriter out = response.getWriter();
out.println("Error:Attachment ID not found.");;
return;
}
if("delete".equals(action.toLowerCase()))...{
String sequence[] = ...{strId};
String process = "";
try...{
process = AttachmentDaoImpl.delete(sequence);
response.sendRedirect("../common/attachment.jsp");
}catch(SQLException e)...{
e.printStackTrace();
}
}
if("download".equals(action.toLowerCase()))...{
//Get the attachment
Attachment attach = null;
try...{
attach = AttachmentDaoImpl.getAttachment(strId);
}catch(SQLException e)...{
e.printStackTrace();
}
if(null!=attach)...{
//Set content type
response.setContentType("application/x-tar");
//Set header
response.setHeader("Content-disposition", "attachment;filename="
+ attach.getFileName());
//Output to client
OutputStream os = response.getOutputStream();
byte[] buffer = attach.getFileData();
os.write(buffer, 0, buffer.length);
os.close();
}
}
}
/**//* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ...{
// TODO Auto-generated method stub
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
try...{
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(!isMultipart)...{
out.println("Not a file upload request.");
return;
}
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();;
// Set factory constraints
factory.setSizeThreshold(MAX_MEMORY_SIZE);
File file = new File(TEMP_PATH);
factory.setRepository(file);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint
upload.setSizeMax(MAX_REQUEST_SIZE);
// Parse the request
if(request.getContentLength()>MAX_REQUEST_SIZE)...{
out.println("Error:Over max size to upload.");
return;
}
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
// Routine below doesn't adapt to return multiple ids.
String strId = "";
while(iter.hasNext())...{
String process = "";
FileItem item = (FileItem) iter.next();
if (item.isFormField()) ...{
process = processFormField(item);
} else ...{
process = processUploadedFile(item);
}
System.out.println(process);
if(process.length()>0&&process.indexOf("Error")>-1)...{
out.println(process);
return;
}else if(process.length()>0&&process.indexOf("Error")<0)...{
strId = process;
}
}
// Return to attachment page
response.sendRedirect("../common/attachment.jsp?id="+strId);
}catch(FileUploadException e)...{
e.printStackTrace();
}
}
}
六、文件上传Jsp页面
<form name="attachment" enctype="multipart/form-data"
action="../servlets/UploadFile" method="post"
onsubmit="return validateAttach()">
<table class="nopadding" border="0" cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td nowrap="nowrap">Choose a File :</td>
<td width="0"><input name="FileName" type="hidden" value="">
<input name="AttachID" value="" type="hidden" value=""><input
name="FilePath" class="formStyle" size="50" style="width: auto;"
type="file"></td>
</tr>
<tr>
<td align="left" nowrap="nowrap" valign="top"> </td>
<td align="left" nowrap="nowrap" valign="top"><input
name="ATTACH" class="formStylebutton" value="Attach"
title="Attach file" type="submit"></td>
</tr>
</tbody>
</table>
</form>
一般来说,文件上传的方法很多,可以应用商业javabean(如jspsmartupload),也可以用开源javabean(如Apache Commons FileUpload),或者独立更生,写一个自己的bean,这里我选择用开源bean,原因有二:1、免费,可扩展;2、功能一般较为完善和规范,省时省力。
以下是实现文件上传的一个实例,该实例的环境如下:
1、MSSQL 数据库
2、Ibatis做存储模式
一、数据库
CREATE TABLE [dbo].[attachment](
[Sequence] NUMERIC(10,0) IDENTITY(1,1) NOT NULL,
[ObjectID] NUMERIC(10,0) NULL,
[ObjectName] VARCHAR(256) NULL,
[FileName] VARCHAR(512) NULL,
[FileSize] INT NULL,
[FileData] IMAGE NULL,
CONSTRAINT [PK_attachment] PRIMARY KEY CLUSTERED ([Sequence])
)
二、POJO 类
public class Attachment ...{
private int sequence;
private int objectId;
private String objectName;
private String fileName;
private int fileSize;
private byte[] fileData;
public byte[] getFileData() ...{
return fileData;
}
public void setFileData(byte[] fileData) ...{
this.fileData = fileData;
}
public String getFileName() ...{
return fileName;
}
public void setFileName(String fileName) ...{
this.fileName = fileName;
}
public int getObjectId() ...{
return objectId;
}
public void setObjectId(int objectId) ...{
this.objectId = objectId;
}
public String getObjectName() ...{
return objectName;
}
public void setObjectName(String objectName) ...{
this.objectName = objectName;
}
public int getSequence() ...{
return sequence;
}
public void setSequence(int sequence) ...{
this.sequence = sequence;
}
public int getFileSize() ...{
return fileSize;
}
public void setFileSize(int fileSize) ...{
this.fileSize = fileSize;
}
}
开始字段fileData 用了java.sql.Blob类型,后发现将InputStream转成Blob类型时较为棘手,所以专用了byte[]类型,不过也有办法,我想可以自己写个Blob类以实现,java.sql.Blob 这个接口。
三、SQLMap XML
<resultMap id="attachmentResult" class="attachment">
<result property="sequence" column="SEQUENCE" nullValue="0"/>
<result property="objectId" column="OBJECTID" nullValue="0"/>
<result property="objectName" column="OBJECTNAME" nullValue=""/>
<result property="fileName" column="FILENAME" nullValue=""/>
<result property="fileSize" column="FILESIZE" nullValue="0"/>
<result property="fileData" column="FILEDATA" />
</resultMap>
<insert id="insertAttachment" parameterClass="attachment">
INSERT INTO ATTACHMENT (
OBJECTID,
OBJECTNAME,
FILENAME,
FILESIZE,
FILEDATA
)VALUES(
#objectId#,
#objectName:VARCHAR#,
#fileName:VARCHAR#,
#fileSize#,
#fileData#
)
<selectKey resultClass="int" keyProperty="sequence">
<!-- SELECT SCOPE_IDENTITY() AS SEQUENCE -->
SELECT @@IDENTITY AS SEQUENCE
</selectKey>
</insert>
这里需要注意的是采用selectKey自动生成id时没有一个十全十美的办法,Ibatis官方网站有所讨论,具体参见 http://www.mail-archive.com/user-cs@ibatis.apache.org/msg01993.html 四、Implement 类
public class AttachmentDaoImpl ...{
public static Integer insert(Attachment attachment) throws SQLException ...{
try ...{
return (Integer) IbatisHelper.getSqlMapper().insert(
"insertAttachment", attachment);
} catch (SQLException e) ...{
e.printStackTrace();
return null;
}
}
}
五、Servlet
/** *//**
* Servlet implementation class for Servlet: UploadFile
*
*/
public class UploadFile extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet ...{
/** *//**
*
*/
private static final long serialVersionUID = 1L;
private static final String CONTENT_TYPE = "text/html;charset=gb2312";
private static final String TEMP_PATH = "c:/windows/temp";
private static final String DESTINATION_PATH = "/attachment/";
private static final int MAX_MEMORY_SIZE = 2*1024*1024;
private static final int MAX_REQUEST_SIZE = 3*1024*1024;
private String fileName = "";
public String processUploadedFile(FileItem item)...{
boolean writeToFile = false;
// Process a file upload
if (writeToFile) ...{
File uploadedFile = new File(DESTINATION_PATH);
try ...{
item.write(uploadedFile);
return "";
} catch (Exception e) ...{
e.printStackTrace();
return "Error:Write to file system failed.";
}
} else ...{
try ...{
InputStream uploadedStream = item.getInputStream();
byte[] b = new byte[uploadedStream.available()];
int fileSize = b.length;
uploadedStream.read(b);
uploadedStream.close();
Attachment attachment = new Attachment();
attachment.setFileName(fileName);
attachment.setFileSize(fileSize);
attachment.setFileData(b);
try...{
Integer key = AttachmentDaoImpl.insert(attachment);
return key.toString();
}catch(SQLException e)...{
e.printStackTrace();
return "Error:Write to database failed.";
}
} catch (IOException e) ...{
e.printStackTrace();
return "Error:I/O write failed.";
}
}
}
public String processFormField(FileItem item)...{
String fieldName = item.getFieldName();
if("FileName".equals(fieldName))
fileName = item.getString();
return "";
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ...{
response.setContentType(CONTENT_TYPE);
String action = request.getParameter("action");
String strId = request.getParameter("id");
if(null==strId||"".equals(strId)) ...{
PrintWriter out = response.getWriter();
out.println("Error:Attachment ID not found.");;
return;
}
if("delete".equals(action.toLowerCase()))...{
String sequence[] = ...{strId};
String process = "";
try...{
process = AttachmentDaoImpl.delete(sequence);
response.sendRedirect("../common/attachment.jsp");
}catch(SQLException e)...{
e.printStackTrace();
}
}
if("download".equals(action.toLowerCase()))...{
//Get the attachment
Attachment attach = null;
try...{
attach = AttachmentDaoImpl.getAttachment(strId);
}catch(SQLException e)...{
e.printStackTrace();
}
if(null!=attach)...{
//Set content type
response.setContentType("application/x-tar");
//Set header
response.setHeader("Content-disposition", "attachment;filename="
+ attach.getFileName());
//Output to client
OutputStream os = response.getOutputStream();
byte[] buffer = attach.getFileData();
os.write(buffer, 0, buffer.length);
os.close();
}
}
}
/**//* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ...{
// TODO Auto-generated method stub
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
try...{
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(!isMultipart)...{
out.println("Not a file upload request.");
return;
}
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();;
// Set factory constraints
factory.setSizeThreshold(MAX_MEMORY_SIZE);
File file = new File(TEMP_PATH);
factory.setRepository(file);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint
upload.setSizeMax(MAX_REQUEST_SIZE);
// Parse the request
if(request.getContentLength()>MAX_REQUEST_SIZE)...{
out.println("Error:Over max size to upload.");
return;
}
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
// Routine below doesn't adapt to return multiple ids.
String strId = "";
while(iter.hasNext())...{
String process = "";
FileItem item = (FileItem) iter.next();
if (item.isFormField()) ...{
process = processFormField(item);
} else ...{
process = processUploadedFile(item);
}
System.out.println(process);
if(process.length()>0&&process.indexOf("Error")>-1)...{
out.println(process);
return;
}else if(process.length()>0&&process.indexOf("Error")<0)...{
strId = process;
}
}
// Return to attachment page
response.sendRedirect("../common/attachment.jsp?id="+strId);
}catch(FileUploadException e)...{
e.printStackTrace();
}
}
}
六、文件上传Jsp页面
<form name="attachment" enctype="multipart/form-data"
action="../servlets/UploadFile" method="post"
onsubmit="return validateAttach()">
<table class="nopadding" border="0" cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td nowrap="nowrap">Choose a File :</td>
<td width="0"><input name="FileName" type="hidden" value="">
<input name="AttachID" value="" type="hidden" value=""><input
name="FilePath" class="formStyle" size="50" style="width: auto;"
type="file"></td>
</tr>
<tr>
<td align="left" nowrap="nowrap" valign="top"> </td>
<td align="left" nowrap="nowrap" valign="top"><input
name="ATTACH" class="formStylebutton" value="Attach"
title="Attach file" type="submit"></td>
</tr>
</tbody>
</table>
</form>
相关文章推荐
- 使用ganymed-ssh2-build.jar来操作linux服务器(上传、下载文件,远程创建目录,远程删除文件等等)
- JSP/servlet实现文件上传下载和删除
- C#实现Ftp各种操作(上传,下载,删除文件,创建目录,删除目录,获得文件列表)
- FTP 工具类. 可以完成对目录创建的创建、修改、删除,对文件的上传下载等操作
- php操作ftp上传文件、创建目录、删除文件、删除目录、下载文件到本地
- .Net 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- thinkphp对文件的上传,删除,下载操作
- servlet实现文件上传、预览、下载、删除功能
- C# 文件操作(上传 下载 删除 文件列表...)(转)
- C# 文件操作(上传 下载 删除 文件列表...)
- Microsoft .NET Framework 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- C# 文件操作(上传 下载 删除 文件列表...)
- C# 文件操作(上传 下载 删除 文件列表)
- C#对FTP的操作(上传,下载,重命名文件,删除文件,文件存在检查)
- ftp上传文件、删除文件、下载文件的操作
- C# 文件操作(上传 下载 删除 文件列表...)
- net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表