当前位置: 代码迷 >> HTML/CSS >> xheditor-文件下传-java-支持html5-application/octet-stream
  详细解决方案

xheditor-文件下传-java-支持html5-application/octet-stream

热度:638   发布时间:2012-11-01 11:11:33.0
xheditor-文件上传-java-支持html5-application/octet-stream
直接上主要代码

UploadFileServlet.java

=====================================================================

?

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();

?? ?}

}

  相关解决方案