从表单上传文件到数据库或服务器
Jimmy
posted @ 2012年3月10日 18:21
in JSP+MySQL
, 4785 阅读
使用html表单上传文件,然后保存到数据库或服务器,使用Apache commons fileUpload组件来实现。组件下载地址:
common fileUpload: http://commons.apache.org/fileupload/index.html
commons io: http://commons.apache.org/io/
PS. 注意两个jar包都要导入
html代码:
<form enctype="multipart/form-data" id="form1" name="form1" action="UploadServlet" method="post">
<input type="file" id="uploadfile" name="uploadfile" />
<input type="text" name="column" />
<input type="submit" value="上传" name="submit">
</form>
1. 上传文件至数据库
String[] errorType ={"exe","com","cgi","asp","jsp"};
InputStream inStream = null;
int MAXSIZE = 5*1024*1024; //文件大小限制为5M
int errorType_int = 1;
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax(MAXSIZE);
fu.setSizeThreshold(MAXSIZE);
fu.setRepositoryPath("D://temp");
List fileItems = fu.parseRequest(request);
Iterator iter = fileItems.iterator();
String name = null;
long size = 0L;
FileItem item = null;
while(iter.hasNext())
{
item = (FileItem)iter.next();
if (!item.isFormField())
{
name = item.getName();//获取上传的文件名
size = item.getSize();//获取上传的文件大小(字节为单位)
if(name == null || name.equals(""))
{
errorType_int = 0;
out.print("上传文件不能为空!"+"<br>");
break;
}
else if(size >= MAXSIZE)
{
errorType_int = 0;
out.println("文件大小超过5M"+"<br>");
break;
}
else
{
String suffix = name.substring(name.lastIndexOf('.'));
for (int temp=0; temp < errorType.length; temp++)
{
if (name != null && name.endsWith(errorType[temp]))
{
out.println(name+": 不允许上传此类型文件!<br>");
errorType_int = 0;
}
}
if(errorType_int != 0)
inStream=item.getInputStream();
}
}
else //获取表单数据
{
if(item.getFieldName().equals("deadline"))
deadline = (String)item.getString();
}
}//while
//开始上传数据
if(errorType_int != 0)
{
int byteread=0;
//读取输入流,也就是上传的文件内容
PreparedStatement pstmt=con.prepareStatement("insert into work_provide(Course_Id,Work_No,Work_Name,Work_quote,Work,Insert_Time,Deadline) values(?,?,?,?,?,?,?)");
pstmt.setString(1,Course_Id);
pstmt.setInt(2,Work_No);
pstmt.setString(3,name);
pstmt.setInt(4,Work_Quote);
pstmt.setBinaryStream(5,inStream,(int)size);
pstmt.setString(6,dateString);
pstmt.setString(7,mdate);
pstmt.executeUpdate();
inStream.close();
con.close();
}
}
这里获取上传文件的输入流,然后用PreparedStatement将文件保存到数据库
2. 上传文件到服务器
String fileDir = this.getServletContext().getRealPath("temp/");
String localFileName = "";
String serverFileName = "";
String serverFilePath = "";
if(ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory factory = new DiskFileItemFactory(); // 基于磁盘文件项目创建一个工厂对象
//factory.setSizeThreshold(20*1024);
factory.setRepository(factory.getRepository());
ServletFileUpload upload = new ServletFileUpload(factory); // 创建一个新的文件上传对象
int size = 10*1024*1024; // 最大上传文件,不超过10M
List formlists = null;
FileItem formitem;
try{
formlists = upload.parseRequest(request); // 解析上传请求
}catch(FileUploadException e){
e.printStackTrace();
}
Iterator iter = formlists.iterator(); // 枚举方法
while(iter.hasNext()) {
formitem = (FileItem)iter.next(); // 获取FileItem对象
if(!formitem.isFormField()) { // 判断是否为文件域
if(formitem.getName()!=null && !formitem.getName().equals("")) { // 判断是否选择了文件
long upFileSize = formitem.getSize(); // 上传文件大小
if (upFileSize > size) {
out.print("<script>alert('上传文件太大![<100M]')</script>");
return;
}
localFileName = formitem.getName(); // 获取文件名
int ii = localFileName.lastIndexOf(".");
String sExt = localFileName.substring(ii,localFileName.length());//取文件名的后缀
if ((!sExt.equals(".xls")) && (!sExt.equals(".xlsx"))) {
out.print("<script>alert('请选择excel文件!')</script>");
return;
}
//得到不重复的文件名,这一步是为了防止同时上传两个同文件名的excel而做的,避免文件名重复
Date dt = new Date(System.currentTimeMillis());
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
serverFileName = fmt.format(dt);
serverFileName = serverFileName + sExt;
//如果不存在该目录,则新建一个
File dir =new File(fileDir);
if (!dir.exists()) {
dir.mkdirs();
}
serverFilePath = fileDir+"\\"+serverFileName;
File serverFile = new File(serverFilePath);
try {
formitem.write(serverFile);
}catch(Exception e) {
e.printStackTrace();
}
}else {
out.print("<script>alert('没有选择文件!')</script>");
return;
}
}else {
try {
if("column".equals(formitem.getFieldName())) {
column = Integer.parseInt(formitem.getString("gb2312").trim());
//System.out.println(column);
}
}catch (NumberFormatException e) {
e.printStackTrace();
return;
}
}
}
2015年6月08日 20:16
瑞特人热特特