jsp简易文件上传(common.fileupload)

昨天开始重新架构我的V&View(维视),之前写文章使用的是一个kindediter的插件,挺好用的.最近不知道咋了,出现了些小问题.早在写V&View的时候就想用以下两种方法实现文章发布问题:

1. 提供上传doc文档,后台自动转换成html录入数据库

2. 直接上传html文档及其相关文件或文件夹的zip压缩包,后台自动解压缩录入数据库

这两种方法可以完成代替在线的文本编辑器了.昨天实现了doc转html了,今天需要解决文件上传问题了.

之前用kindediter里面也有文件上传的jsp实例:upload_json.jsp,是用fileupload实现的,就顺势效仿一下了,最后发现fileupload真的很实用啊。代码挺简单的

开始之前当然需要从 http://jakarta.apache.org/commons/fileupload/ 下载到最新版的 fileupload啦

 

我的uploader.jsp:

之前的jsp不能读取除file以外的input,因为form设置了enctype="multipart/form-data",直接使用request.getParameter()是取不出来别的值的,所以刚对jsp优化了一下,注释部分是原来的代码

<%@page import="vell.bibi.vview.util.FileUtil"%>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import="java.util.*,java.io.*" %>

<%@ page import="java.text.SimpleDateFormat" %>

<%@ page import="org.apache.commons.fileupload.*" %>

<%@ page import="org.apache.commons.fileupload.disk.*" %>

<%@ page import="org.apache.commons.fileupload.servlet.*" %>

<%@ page import="org.json.simple.*" %>

<%

String FileUID = null;

String UserID = null;

//文件保存目录路径

String savePath = pageContext.getServletContext().getRealPath("/") + "temp/";

//文件保存目录URL

String saveUrl  = request.getContextPath() + "/temp/";

//定义允许上传的文件扩展名

List<String> extList = new ArrayList<String>();

extList.add("doc");

extList.add("zip");

//最大文件大小5M

long maxSize = 5*1024*1024;

response.setContentType("text/html; charset=UTF-8");

if(!ServletFileUpload.isMultipartContent(request)){

    out.println(getError("请选择文件。"));

    return;

}

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

upload.setHeaderEncoding("UTF-8");

List items = upload.parseRequest(request);

Iterator itr = items.iterator();

while (itr.hasNext()) {

    FileItem item = (FileItem) itr.next();

    String fileName = item.getName();

    long fileSize = item.getSize();

// 检查当前项目是普通表单项目还是上传文件。  

    String fieldName = item.getFieldName();

        if (item.isFormField()) {

        //提取其他参数 

        if (fieldName.equals("FileUID")) {

            FileUID = item.getString();// 显示表单内容。 

            savePath += FileUID + "/";

        } else if (fieldName.equals("UserID")) {  

            UserID = item.getString();

        }

    }else{

        //检查文件大小

        if(item.getSize() > maxSize){

            out.println(getError("上传文件大小超过限制。"));

            return;

        }

        //检查扩展名

        String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

        if(!extList.contains(fileExt)){

            out.println(getError("上传文件扩展名是不允许的扩展名"));

            return;

        }


        try{

            FileUtil.makeDir(savePath);//创建完整的保存路径 

            File uploadedFile = new File(savePath, fileName);

            item.write(uploadedFile);

        }catch(Exception e){

            FileUtil.deleteDir(savePath);//删除文件夹

            out.println(getError("上传文件失败。"));

            return;

        }


        JSONObject obj = new JSONObject();

        obj.put("error", 0);

        obj.put("FileUID", FileUID);

        obj.put("UerID", UserID);

        out.println(obj.toJSONString());

    }

    /*if (!item.isFormField()) {

        //检查文件大小

        if(item.getSize() > maxSize){

            out.println(getError("上传文件大小超过限制。"));

            return;

        }

        //检查扩展名

        String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

        if(!extList.contains(fileExt)){

            out.println(getError("上传文件扩展名是不允许的扩展名"));

            return;

        }

        try{

            FileUtil.makeDir(savePath);//创建完整的保存路径 

            File uploadedFile = new File(savePath, fileName);

            item.write(uploadedFile);

        }catch(Exception e){

            FileUtil.deleteDir(savePath);//删除文件夹

            out.println(getError("上传文件失败。"));

            return;

        }

        JSONObject obj = new JSONObject();

        obj.put("error", 0);

        obj.put("url", saveUrl + fileName);

        out.println(obj.toJSONString());

    }*/

}

%>

<%!

private String getError(String message) {

    JSONObject obj = new JSONObject();

    obj.put("error", 1);

    obj.put("message", message);

    return obj.toJSONString();

}

%>

 

其中用到一个FileUtil的工具类,主要用来创建和删除文件夹的:

package vell.bibi.vview.util;


import java.io.File;


public class FileUtil {

    

    public static void makeDir(File dir) {

        if(dir == null) return;

        if(!dir.getParentFile().exists()) {

            makeDir(dir.getParentFile());

        }

        if(!dir.exists()){

            dir.mkdir();

        }

    }

    

    public static void makeDir(String dirStr){

        if(dirStr == null) return;

        File dir = new File(dirStr);

        makeDir(dir);

    }


    public static boolean deleteDir(File dir) {

        if (dir.isDirectory()) {

            String[] children = dir.list();

            //递归删除目录中的子目录下

            for (int i=0; i<children.length; i++) {

                boolean success = deleteDir(new File(dir, children[i]));

                if (!success) {

                    return false;

                }

            }

        }

        return dir.delete();

    }

    

    public static void deleteDir(String dirStr){

        if(dirStr == null) return;

        File dir = new File(dirStr);

        deleteDir(dir);

    }

}

 

对应的html文件只需要用一个表单就搞定了:

<form action="uploader.jsp" method="post" enctype="multipart/form-data">

<input type="file" name="FILEDATA"/><br/>

<input type="hidden" name="FileUID" value="<%=UID.next() %>"/>
            <input type="hidden" name="UserID" value="<%=USER.getId() %>" />

        <input type="submit" value="提交"/>

</form>

上传部分解决了,接下来又要进行数据库的改造了,彻底摆脱网页编辑器插件还有一大堆工作要做啊。我很期待我的新版V&View,嘿嘿

修改时间:2013-12-19 22:29

你可能感兴趣的:(fileupload)