昨天开始重新架构我的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

jsp简易文件上传(common.fileupload)的更多相关文章

  1. 文件上传组件FileUpload 以及邮箱搭建JavaMail

     文件上传与下载 1.1 文件上传 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 文件上传,要点: 前台: 1 ...

  2. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  3. JSP多文件上传到服务器

    问题描述: 作为一个Java开发Web方向的程序员,很重要的一个功能,就是上传文件功能是一定要掌握的,今天整理了一下代码. 1.JSP显示界面代码和动态添加上传文件个数. <%@ page la ...

  4. jsp Servlet 文件上传

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

  5. JSP的文件上传

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/file-uploading.html: 一个JSP可以用一个HTML表单标签,它允许用户上传文件到服务器 ...

  6. Android+jsp +html 文件上传案例 已测试 成功通过

    我文件上传一直是广大读者一个问题 今天就把成功案例写下 javaweb 网页前段 <%@ page language="java" import="java.uti ...

  7. 基于jsp的文件上传和下载

    参考: 一.JavaWeb学习总结(五十)--文件上传和下载 此文极好,不过有几点要注意: 1.直接按照作者的代码极有可能listfile.jsp文件中 <%@taglib prefix=&qu ...

  8. 文件上传(FileUpload控件)

    asp.net 文件上传,大文件上传.   新建一个asp.net页面,在工具栏里拖入 FileUpload 上传控件.一个按钮 Button  !    !     ! 进入Button事件 //- ...

  9. jsp实现文件上传下载

    文件上传: upload.jsp <form action="uploadServlet" method="post" enctype="mul ...

随机推荐

  1. python引入导入自定义模块和外部文件

    参考:http://blog.csdn.net/devil_2009/article/details/15816237 项目中想使用以前的代码,或者什么样的需求致使你需要导入外部的包 如果是web 下 ...

  2. Python 出现需要使用fPIC重新编译的问题

    在已经存在python安装环境的情况下,当安装第三方的包的时候出现报错提示 /usr/bin/ld: .../lib/libpython2.7.a(abstract.o): relocation R_ ...

  3. 史上最全github使用方法:github入门到精通--备用

    [初识Github] 首先让我们大家一起喊一句“Hello Github”.YEAH!就是这样. Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理 ...

  4. 常用DOS命令参数详解

    一.DIR命令的格式: dir [D:][PATH][NAME][[/A][:attrib]][/o:[sorted][/s][/b][/l][/c[h] (1)dir /a:attrib 缺省包含所 ...

  5. Hbase 0.96 比 hbase 0.94的改变

    转载:http://blog.csdn.net/hxpjava1/article/details/20043703 环境: hadoop:hadoop-2.2.0 hbase:hbase-0.96.0 ...

  6. [HDOJ - 5282] Senior's String 【DP】

    题目链接:BZOJ - 5282 题目分析 LCS 就是用经典的 O(n^2) DP 解决,f[i][j] 表示 x 串前 i 个字符与 y 串前 j 个字符的 LCS 长度. f[i][j] = m ...

  7. 【转】IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)

    概念很重要,一定要掌握.实践都是基于它们的哟 ~~~~~~~~~~~~~~~~~ http://blog.csdn.net/historyasamirror/article/details/57783 ...

  8. Android ExpandableListView的简单应用

    Expandablelistview1Activity.java package com.wangzhu.demoexpandablelistview; import java.util.ArrayL ...

  9. easyui源码翻译1.32--ComboBox(下拉列表框)

    前言 扩展自$.fn.combo.defaults.使用$.fn.combobox.defaults重写默认值对象.下载该插件翻译源码 下拉列表框显示一个可编辑文本框和下拉式列表,用户可以选择一个值或 ...

  10. SQLite入门与分析(五)---Page Cache之并发控制

    写在前面:本节主要谈谈SQLite的锁机制,SQLite是基于锁来实现并发控制的,所以本节的内容实际上是属于事务处理的,但是SQLite的锁机制实现非常的简单而巧妙,所以在这里单独讨论一下.如果真正理 ...