package reyo.sdk.utils.file;

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; 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,txt"; 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,txt"; 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"; } // 上传文件数据处理过程
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(); } }

xheditor-文件上传-java-支持html5-application/octet-stream的更多相关文章

  1. HTTP文件上传服务器-支持超大文件HTTP断点续传的实现办法

    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传.笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文件上传的一些基本 ...

  2. jQuery插件之路(三)——文件上传(支持拖拽上传)

    好了,这次咱一改往日的作风,就不多说废话了,哈哈.先贴上源代码地址,点击获取.然后直接进入主题啦,当然,如果你觉得我有哪里写的不对或者欠妥的地方,欢迎留言指出.在附上一些代码之前,我们还是先来了解下, ...

  3. 聊一聊jquery文件上传(支持多文件上传)

    谈到文件上传,现在一般都用现成的组件可以使用.PC端的可以使用uploadify.针对微网站H5也有uploadifive.但是这组件并不能满足各种场景的需求,例如:预览 切图 放大缩小,取消之类的. ...

  4. 【FTP】FTP文件上传下载-支持断点续传

    Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...

  5. Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart 1.简 ...

  6. PHP 大文件上传,支持断点续传,求具体方案、源码或者文件上传插件

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  7. 前后端分离跨服务器文件上传-Java SpringMVC版

    近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一 ...

  8. IOS 多文件上传 Java web端(后台) 使用List<MultipartFile> 接收出现的问题

    先上正确的示例: 主要是设置我们的request的content-type为multipart/form-data NSDictionary *param = @{@"assignee&qu ...

  9. Facade模式实现文件上传(Flash+HTML5)

    一.前言 确定了渐进式增强的上传方式,接下来我们需要将上传功能从具体的业务逻辑中剥离出来,作为公共组件供业务层调用.这就要求我们必须对业务层隐藏上传细节,只暴露统一的上传API.这时候大家是不是跟我一 ...

  10. 文件上传(java web)

    文件上传: 对表单的要求: * method="post" * enctype="multipart/form-data" * 表单中需要添加文件表单项:< ...

随机推荐

  1. Coursera台大机器学习技法课程笔记13-Deep Learning

    深度学习面临的问题和现在解决的办法: 简要来说,分两步使用DL:初始化时一层一层的选择权重,而后再进行训练: 那么怎么做pre-training,即怎么选择权重呢?好的权重能够不改变原有资料的信息,即 ...

  2. java字节流复制文件

    import java.io.FileInputStream; import java.io.FileOutputStream; import org.junit.Test; public class ...

  3. SqlServer中 SET DATEFIRST更改

    在 SQL Server 中默认情况下,每周的开始都是从周日开始算起的,如果默认星期一呢? 这里有三种方式可以解决这个问题: 一:直接通过 SET DATEFIRST VALUE 来更改重新生成新的 ...

  4. Springbatch Miscellanea Notes

    1.scope="step",如下图,这是一种后绑定的方式,生成Step的时候,才去创建bean <bean id="testTasklet" paren ...

  5. Angular快速学习笔记(4) -- Observable与RxJS

    介绍RxJS前,先介绍Observable 可观察对象(Observable) 可观察对象支持在应用中的发布者和订阅者之间传递消息. 可观察对象可以发送多个任意类型的值 -- 字面量.消息.事件. 基 ...

  6. Java基础常见英语词汇(共70个)

    ——————————ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— Java英文单词 OO: object—oriented ,面向对象 OOP:obje ...

  7. 远程执行shell

    目前我的需求是在我的hadoop集群搭建起来前,能定时做一下简易指标的监控,目前我的方案就是在我的server机上,定时执行远程脚本出指标数据,然后通过python脚本发送邮件. 远程执行脚本如下: ...

  8. java实现最小堆

    1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于它的所有后裔,最小元在堆的根上. 堆总是一棵完全树 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小 ...

  9. 吴恩达-coursera-机器学习-week7

    十二.支持向量机(Support Vector Machines) 12.1 优化目标 12.2 大边界的直观理解 12.3 数学背后的大边界分类(选修) 12.4 核函数1 12.5 核函数2 12 ...

  10. URAL 1963 Kite 计算几何

    Kite 题目连接: http://acm.hust.edu.cn/vjudge/contest/123332#problem/C Description Vova bought a kite con ...