zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Spock
    Spock
    Spock
    Spock
    Spock
    Spock
    Python3 与 Python2 的不同
    python 文件处理
    Django 数据迁移
    Python 特殊方法
  • 原文地址:https://www.cnblogs.com/VellBibi/p/3482748.html
Copyright © 2011-2022 走看看