xheditor-文件上传-java-支持html5-application/octet-stream
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的更多相关文章
- HTTP文件上传服务器-支持超大文件HTTP断点续传的实现办法
最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传.笔者在以前的博客如何实现支持大文件的高性能HTTP文件上传服务器已经介绍了实现大文件上传的一些基本 ...
- jQuery插件之路(三)——文件上传(支持拖拽上传)
好了,这次咱一改往日的作风,就不多说废话了,哈哈.先贴上源代码地址,点击获取.然后直接进入主题啦,当然,如果你觉得我有哪里写的不对或者欠妥的地方,欢迎留言指出.在附上一些代码之前,我们还是先来了解下, ...
- 聊一聊jquery文件上传(支持多文件上传)
谈到文件上传,现在一般都用现成的组件可以使用.PC端的可以使用uploadify.针对微网站H5也有uploadifive.但是这组件并不能满足各种场景的需求,例如:预览 切图 放大缩小,取消之类的. ...
- 【FTP】FTP文件上传下载-支持断点续传
Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...
- Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart 1.简 ...
- PHP 大文件上传,支持断点续传,求具体方案、源码或者文件上传插件
文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...
- 前后端分离跨服务器文件上传-Java SpringMVC版
近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一 ...
- IOS 多文件上传 Java web端(后台) 使用List<MultipartFile> 接收出现的问题
先上正确的示例: 主要是设置我们的request的content-type为multipart/form-data NSDictionary *param = @{@"assignee&qu ...
- Facade模式实现文件上传(Flash+HTML5)
一.前言 确定了渐进式增强的上传方式,接下来我们需要将上传功能从具体的业务逻辑中剥离出来,作为公共组件供业务层调用.这就要求我们必须对业务层隐藏上传细节,只暴露统一的上传API.这时候大家是不是跟我一 ...
- 文件上传(java web)
文件上传: 对表单的要求: * method="post" * enctype="multipart/form-data" * 表单中需要添加文件表单项:< ...
随机推荐
- python随笔(一)
(1) 两个乘号对不同的数据类型,其含义是不同的. 对整数来说,连乘表示幂次,比如2**2**3 = 256 对于字符串来说一个乘号的意义是,‘abc'*3 = 'abcabcabc' (2) 一个数 ...
- Codeforces 671A Recycling Bottles(贪心+思维)
题目链接:http://codeforces.com/problemset/problem/671/A 题目大意:给你两个人的位置和一个箱子的位置,然后给出n个瓶子的位置,要求让至少一个人去捡瓶子放到 ...
- [转] map/reduce
如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念. ...
- norbert-构建服务器集群感知的 Java 应用程序
http://www.ibm.com/developerworks/cn/java/j-zookeeper/index.html
- jQuery的Promise
认识jQuery的Promise 先前了解了ES6的Promise对象,来看看jQuery中的Promise,也就是jQuery的Deferred对象. 打开浏览器的控制台先. <scrip ...
- 【LOJ】#2493. 「BJOI2018」染色
题面 题解 推结论大题--然而我推不出什么结论 奇环显然是NO 如果一个联通块里有两个分离的环,也是NO 如果一个联通块里,点数为n,边数为m m <= n的时候,是YES m >= n ...
- 浅析Entity FrameWork性能优化
浅析EF性能优化 1. 数据Load 延迟加载:当实体第一次读取时,相关数据没有加载:当第一次试图访问导航属性时,所需的导航数据自动加载,EF默认使用这种方式加载数据,尽量使用预先加载和显 ...
- mysql索引原理剖析
一.索引的原理 所谓索引,即是快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(B+树相比B树,其非叶子节点占用更小的空间,可以有更多非叶子节点存放在再内存中,减少大量的IO ...
- Web大前端面试题-Day4
1. 如何实现瀑布流? 瀑布流布局的原理:1) 瀑布流布局要求要进行布置的元素等宽, 然后计算元素的宽度, 与浏览器宽度之比,得到需要布置的列数;2) 创建一个数组,长度为列数, 里面的值 ...
- 面向对象设计原则 接口分离原则(Interface Segregation Principle)
接口隔离原则 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 从接口隔离原则的定义可以看出,他似乎跟SRP有许多相似之处. 是的其实ISP和SRP都是强调职责的单一性 ...