`
suiu
  • 浏览: 33309 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

HTML5上传

 
阅读更多
package com.XXX.xheditor.servlet;
 



import java.io.BufferedOutputStream;
 
import java.io.File;
 
import java.io.FileOutputStream;
 
import java.io.IOException;
 
import java.io.OutputStream;
 
import java.io.PrintWriter;
 
import java.io.Serializable;
 
import java.text.SimpleDateFormat;
 
import java.util.Date;
 
import java.util.HashMap;
 
import java.util.Iterator;
 
import java.util.List;
 
import java.util.Map;
 
import java.util.UUID;
 



import javax.servlet.ServletException;
 
import javax.servlet.http.HttpServlet;
 
import javax.servlet.http.HttpServletRequest;
 
import javax.servlet.http.HttpServletResponse;
 



import org.apache.commons.fileupload.DiskFileUpload;
 
import org.apache.commons.fileupload.FileItem;
 
import org.apache.commons.lang.StringUtils;
 






//  xhEditor文件上传的Java - Servlet实现.
 
//  @ author WeiMiao
 
//  @ refer to easinchu
 
//  @ version 2
 
//  @ description 增加html5上传功能的支持
 



public class UploadFileServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1541334866883495283L;
 
 
 
    private static String baseDir = "/UploadFile/"; // 上传文件存储目录
 
    private static String fileExt = "jpg,jpeg,bmp,gif,png";
 
    private static Long maxSize = 0l;
 
    private static String dirType = "1"; // 0:不建目录 1:按天存入目录 2:按月存入目录 3:按扩展名存目录 建议使用按天存
 



 
 
    public void init() throws ServletException {
 
        baseDir = this.getInitParameter("baseDir"); //获取web.xml中servlet的配置文件目录参数
 
        if (StringUtils.isEmpty(baseDir)) baseDir = "/UploadFile/"; //获取文件上传存储的相当路径
 



        String realBaseDir = this.getServletConfig().getServletContext().getRealPath(baseDir);
 
        File baseFile = new File(realBaseDir);
 
        if (!baseFile.exists()) {
 
            baseFile.mkdir();
 
        }
 



        fileExt = this.getInitParameter("fileExt"); //获取文件类型参数
 
        if (StringUtils.isEmpty(fileExt)) fileExt = "jpg,jpeg,gif,bmp,png";
 



        String maxSize_str = this.getInitParameter("maxSize"); //获取文件大小参数
 
        if (StringUtils.isNotEmpty(maxSize_str)) {
 
            maxSize = new Long(maxSize_str);
 
        } else {
 
            maxSize = Long.valueOf("5242880"); //5M
 
        }
 



        dirType = this.getInitParameter("dirType"); //获取文件目录类型参数
 



        if (StringUtils.isEmpty(dirType)) dirType = "1";
 
        if (",0,1,2,3,".indexOf("," + dirType + ",") < 0) dirType = "1";
 
    }
 



 
 
    // 上传文件数据处理过程
 
 
 
    @SuppressWarnings( { "unchecked" })
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
        response.setContentType("text/html; charset=UTF-8");
 
        response.setHeader("Cache-Control", "no-cache");
 



        String err = "";
 
        String newFileName = "";
 
 
 
        if ("application/octet-stream".equals(request.getContentType())) { //HTML 5 上传
 
            try {
 
                String dispoString = request.getHeader("Content-Disposition");
 
                int iFindStart = dispoString.indexOf("name=\"")+6;
 
                int iFindEnd = dispoString.indexOf("\"", iFindStart);
 
 
 
                iFindStart = dispoString.indexOf("filename=\"")+10;
 
                iFindEnd = dispoString.indexOf("\"", iFindStart);
 
                String sFileName = dispoString.substring(iFindStart, iFindEnd);
 
 
 
                int i = request.getContentLength();
 
                byte buffer[] = new byte[i];
 
                int j = 0;
 
                while(j < i) { //获取表单的上传文件
 
                    int k = request.getInputStream().read(buffer, j, i-j);
 
                    j += k;
 
                }
 
 
 
                if (buffer.length == 0) { //文件是否为空
 
                    printInfo(response, "上传文件不能为空", "");
 
                    return;
 
                }
 
                if (maxSize > 0 && buffer.length > maxSize) { //检查文件大小
 
                    printInfo(response, "上传文件的大小超出限制", "");
 
                    return;
 
                }
 
 
 
                String filepathString = getSaveFilePath(sFileName, response);
 
                if ("不允许上传此类型的文件".equals(filepathString)) return; //检查文件类型
 
 
 
 
 
                OutputStream out=new BufferedOutputStream(new FileOutputStream(this.getServletConfig().getServletContext().getRealPath("") + filepathString,true));
 
                out.write(buffer);
 
                out.close();
 
 
 
                newFileName = request.getContextPath() + filepathString;
 
            } catch (Exception ex) {
 
                System.out.println(ex.getMessage());
 
                newFileName = "";
 
                err = "错误: " + ex.getMessage();
 
            }
 
        } else {
 
            DiskFileUpload upload = new DiskFileUpload();
 
 
 
            try {
 
                List<FileItem> items = upload.parseRequest(request);
 
                Map<String, Serializable> fields = new HashMap<String, Serializable>();
 
                Iterator<FileItem> iter = items.iterator();
 
                while (iter.hasNext()) {
 
                    FileItem item = (FileItem) iter.next();
 
                    if (item.isFormField())
 
                        fields.put(item.getFieldName(), item.getString());
 
                    else
 
                        fields.put(item.getFieldName(), item);
 
                }
 
                FileItem uploadFile = (FileItem) fields.get("filedata"); //获取表单的上传文件
 
                String fileNameLong = uploadFile.getName(); //获取文件上传路径名称
 



                if (uploadFile.getSize() == 0) { //文件是否为空
 
                    printInfo(response, "上传文件不能为空", "");
 
                    return;
 
                }
 
                if (maxSize > 0 && uploadFile.getSize() > maxSize) { //检查文件大小
 
                    printInfo(response, "上传文件的大小超出限制", "");
 
                    return;
 
                }
 
 
 
                String filepathString = getSaveFilePath(fileNameLong, response);
 
                if ("不允许上传此类型的文件".equals(filepathString)) return; //检查文件类型
 
 
 
                File savefile = new File(this.getServletConfig().getServletContext().getRealPath("") + filepathString);
 
                uploadFile.write(savefile); //存储上传文件
 



                newFileName = request.getContextPath() + filepathString;
 
            } catch (Exception ex) {
 
                System.out.println(ex.getMessage());
 
                newFileName = "";
 
                err = "错误: " + ex.getMessage();
 
            }
 
        }
 
        printInfo(response, err, newFileName);
 
    }
 
 
 
    public String getSaveFilePath(String sFileName, HttpServletResponse response) throws IOException {
 
        String extensionName = sFileName.substring(sFileName.lastIndexOf(".") + 1); //获取文件扩展名
 
 
 
        if (("," + fileExt.toLowerCase() + ",").indexOf("," + extensionName.toLowerCase() + ",") < 0) { //检查文件类型
 
        printInfo(response, "不允许上传此类型的文件", "");
 
        return "不允许上传此类型的文件";
 
        }
 
 
 
        String fileFolder = ""; // 0:不建目录, 1:按天存入目录, 2:按月存入目录, 3:按扩展名存目录.建议使用按天存。
 
        if (dirType.equalsIgnoreCase("1")) fileFolder = new SimpleDateFormat("yyyyMMdd").format(new Date());
 
        if (dirType.equalsIgnoreCase("2")) fileFolder = new SimpleDateFormat("yyyyMM").format(new Date());
 
        if (dirType.equalsIgnoreCase("3")) fileFolder = extensionName.toLowerCase();
 



        String saveDirPath = baseDir + fileFolder + "/"; //文件存储的相对路径
 
        String saveFilePath = this.getServletConfig().getServletContext().getRealPath("") + saveDirPath; //文件存储在容器中的绝对路径
 



        File fileDir = new File(saveFilePath); //构建文件目录以及目录文件
 
        if (!fileDir.exists()) {
 
            fileDir.mkdirs();
 
        }
 
        String filename = UUID.randomUUID().toString(); //重命名文件
 
 
 
        return saveDirPath + filename + "." + extensionName;
 
    }
 



 
 
    // 使用I/O流输出 json格式的数据
 
 
 
    public void printInfo(HttpServletResponse response, String err, String newFileName) throws IOException {
 
        response.setContentType("text/plain");
 
        response.setCharacterEncoding("UTF-8");
 
        PrintWriter out = response.getWriter();
 
        out.println("{\"err\":\"" + err + "\",\"msg\":\"" + newFileName + "\"}");
 
        out.flush();
 
        out.close();
 
    }
 
}

 

分享到:
评论

相关推荐

    html5 上传图片

    "html5 上传图片"这个主题涉及到HTML5中的一些关键特性,包括File API、Canvas以及使用Ajax进行无刷新上传。 1. **File API**: HTML5引入了File API,允许用户在不离开当前页面的情况下选择和操作本地文件。File ...

    头像HTML5上传 1.2 (saya_avatarupload).zip

    "头像HTML5上传 1.2 (saya_avatarupload).zip" 是一个针对这一需求设计的插件,它提供了高效且兼容性的解决方案,特别强调对手机版的支持,不再依赖过时的Flash技术。 这个插件的核心知识点主要包括: 1. **HTML5 ...

    HTML5上传for php

    ### HTML5上传for PHP知识点详解 #### 一、概述 在现代Web开发中,文件上传是常见的需求之一。随着HTML5技术的发展,开发者们能够利用更先进的特性来优化用户体验和提高上传效率。本文将深入探讨如何使用HTML5结合...

    HTML5上传图手机图片压缩

    HTML5上传图手机图片压缩是现代网页开发中的一个重要技术,特别是在移动设备日益普及的今天。这一功能使得用户可以在不离开浏览器的情况下,直接在网站上上传并压缩来自他们手机的图片,提高了用户体验,同时也减轻...

    HTML5上传组件

    HTML5上传组件是现代网页应用中一种常用的交互元素,它极大地改善了用户在网页上进行文件上传的体验。相比传统的HTML4,HTML5引入了一系列新的API和特性,使得开发者能够创建功能更强大、用户体验更好的上传功能。在...

    基于Ajax的Flash、HTML5上传组件(支持C#)

    【基于Ajax的Flash、HTML5上传组件(支持C#)】是一种先进的Web开发技术,它结合了Ajax、Flash和HTML5的优势,为用户提供了一种高效、便捷的文件上传解决方案。在传统的网页上传方式中,用户通常需要刷新整个页面...

    html5上传插件支持文件上传和图片上传代码

    HTML5上传插件是利用HTML5技术实现的一种增强网页文件上传功能的工具,它极大地提升了用户在网页上处理文件和图片的体验。HTML5引入了许多新的API和特性,其中包括File API、FormData对象以及拖放(Drag and Drop)...

    html5uploader、Huploadify、webuploader html5上传合集(总有一款适用你)

    HTML5上传技术是现代网页应用中的重要组成部分,尤其在处理大量数据或媒体文件时显得尤为重要。本合集包含了三款著名的HTML5上传组件——html5uploader、Huploadify和webuploader,它们各自拥有独特的特性和功能,...

    PHP+Html5上传demo带预览、进度条

    【PHP+HTML5上传技术详解】 在Web开发中,文件上传功能是不可或缺的一部分,而PHP作为后端服务器语言,与HTML5的结合可以提供更高效、用户体验更好的上传方式。本示例"PHP+Html5上传demo带预览、进度条"就是这样一...

    HTML5上传多图片

    HTML5上传多图片是现代网页开发中的一个重要特性,它极大地改善了用户在网站上交互时的体验。在传统的HTML4中,用户只能单个上传文件,而HTML5引入了File API,使得一次选择并上传多个文件成为可能。下面将详细阐述...

    uploadify-html5上传插件-jsp例子和api

    下面,我们将深入探讨Uploadify、HTML5上传、JSP相关知识以及如何将它们结合使用。 **Uploadify 插件** Uploadify是一个轻量级的JavaScript和Flash插件,它允许用户通过简单的API实现多文件上传功能。尽管最初依赖...

    js HTML5上传示例代码完整版

    HTML5上传示例代码完整版主要介绍了一种使用JavaScript和HTML5实现的文件上传功能。通过这种方式,用户能够上传文件至服务器,并且在整个上传过程中,实现了多文件选择、自定义提交参数、文件大小和数量限制、MD5...

    PHPCMS 修改flash附件上传 改为H5上传

    HTML5上传是现代网页开发中的一个重要特性,它提供了更安全、更稳定且用户体验更好的文件上传方式。HTML5的File API允许用户在不借助插件的情况下直接在浏览器中处理文件,包括选择文件、预览、上传等操作。相比...

    html5上传图片文件,图片文件转换为base64存入数据库

    这个是基于某个同志的资源...另外由于缓存资源的原因没有考虑上传按钮的添加,上传图片即上传,ajax为异步请求。 至于后台是C#没啥好看的,就是数据库插入 这里小小的向大家要1分,不要骂我,下东西都没分了,拜谢。

    Html5上传插件for asp.net

    HTML5上传插件在ASP.NET中的应用主要集中在提高文件上传的用户体验和兼容性上,尤其在移动设备上表现优秀。本插件名为“Html5上传插件for asp.net”,它利用了百度开发的WebUploader组件,这是一款强大的前端文件...

    jquery html5上传图片插件头像截图图像截取上传表单

    总之,"jquery html5上传图片插件头像截图图像截取上传表单"是一个结合了jQuery强大功能和HTML5现代特性的前端开发实践。通过合理利用这些技术,开发者可以创建出功能强大、用户体验优良的图片上传组件,尤其适用于...

    localResizeIMG3-master HTML5上传插件

    HTML5上传插件localResizeIMG3-master是一款专为PC和移动设备设计的JavaScript库,它致力于简化图片上传过程,尤其适用于需要在前端进行图片预处理的场景。此插件主要解决的问题是,允许用户在上传图片前进行尺寸...

    HTML5上传按钮ui动画特效.zip

    HTML5上传按钮UI动画特效是一种增强用户交互体验的技术,它结合了HTML5的新特性、CSS3的动画效果以及JavaScript库如jQuery的运用。这个压缩包"HTML5上传按钮ui动画特效.zip"包含了一套实现此类特效的代码资源,适合...

    html5上传视频和图片 可预览上传 手机端HTML5+js 多文件上传

    在这个场景中,我们关注的是HTML5在上传视频和图片方面的应用,特别是如何实现预览和多文件上传功能。 在HTML5中,`&lt;input type="file"&gt;`元素得到了极大的增强,它允许用户选择本地文件进行上传,并且可以通过...

    一个基于 Formdata 的 HTML5 上传闭包组件.zip

    "一个基于 FormData 的 HTML5 上传闭包组件"是一个专为文件上传设计的解决方案,它利用了 HTML5 的新特性,尤其是 FormData 对象,实现了高效且用户友好的文件上传功能。 FormData 对象是 HTML5 中引入的一个关键...

Global site tag (gtag.js) - Google Analytics