首页>代码>多文件上传插件Stream,解决不同浏览器上传文件的插件,是Uploadify的Flash版和Html5版的结合,带进度条,并支持html5断点续传,拖拽等功能>/stream/src/main/java/cn/twinkling/stream/servlet/StreamServlet.java
package cn.twinkling.stream.servlet; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.json.JSONException; import org.json.JSONObject; import cn.twinkling.stream.util.IoUtil; /** * File reserved servlet, mainly reading the request parameter and its file * part, stored it. */ public class StreamServlet extends HttpServlet { private static final long serialVersionUID = -8619685235661387895L; static final String CROSS_ORIGIN = "CROSS_ORIGIN"; private String origins; /** when the has increased to 10kb, then flush it to the hard-disk. */ static final int BUFFER_LENGTH = 10240; static final String START_FIELD = "start"; public static final String CONTENT_RANGE_HEADER = "content-range"; @Override public void init() throws ServletException { origins = getServletContext().getInitParameter(CROSS_ORIGIN); } /** * Lookup where's the position of this file? */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doOptions(req, resp); final String token = req.getParameter(TokenServlet.TOKEN_FIELD); final String size = req.getParameter(TokenServlet.FILE_SIZE_FIELD); final String fileName = req.getParameter(TokenServlet.FILE_NAME_FIELD); final PrintWriter writer = resp.getWriter(); /** TODO: validate your token. */ JSONObject json = new JSONObject(); long start = 0; boolean success = true; String message = ""; try { File f = IoUtil.getFile(token, fileName); start = f.length(); /** file size is 0 bytes. */ if (token.endsWith("_0") && "0".equals(size) && 0 == start) f.renameTo(IoUtil.getFile(fileName)); } catch (FileNotFoundException fne) { message = "Error: " + fne.getMessage(); success = false; } finally { try { if (success) json.put(START_FIELD, start); json.put(TokenServlet.SUCCESS, success); json.put(TokenServlet.MESSAGE, message); } catch (JSONException e) {} writer.write(json.toString()); IoUtil.close(writer); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doOptions(req, resp); final String token = req.getParameter(TokenServlet.TOKEN_FIELD); final String fileName = req.getParameter(TokenServlet.FILE_NAME_FIELD); Range range = IoUtil.parseRange(req); OutputStream out = null; InputStream content = null; final PrintWriter writer = resp.getWriter(); /** TODO: validate your token. */ JSONObject json = new JSONObject(); long start = 0; boolean success = true; String message = ""; try { File f = IoUtil.getFile(token, fileName); if (f.length() != range.getFrom()) throw new IOException("File from position error!"); out = new FileOutputStream(f, true); content = req.getInputStream(); int read = 0; final byte[] bytes = new byte[BUFFER_LENGTH]; while ((read = content.read(bytes)) != -1) out.write(bytes, 0, read); start = f.length(); /** rename the file */ if (range.getSize() == start) { f.renameTo(IoUtil.getFile(fileName)); System.out.println("TK: `" + token + "`, NE: `" + fileName + "`"); } } catch (FileNotFoundException fne) { message = "Error: " + fne.getMessage(); success = false; } catch (IOException io) { message = "IO Error: " + io.getMessage(); success = false; } finally { try { if (success) json.put(START_FIELD, start); json.put(TokenServlet.SUCCESS, success); json.put(TokenServlet.MESSAGE, message); } catch (JSONException e) {} writer.write(json.toString()); IoUtil.close(out); IoUtil.close(content); IoUtil.close(writer); } } @Override protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("application/json"); resp.setHeader("Access-Control-Allow-Headers", "Content-Range,Content-Type"); resp.setHeader("Access-Control-Allow-Origin", origins); resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); } @Override public void destroy() { super.destroy(); } }
最近下载更多
我真的是小明 LV10
2021年7月19日
hzszwx LV1
2021年5月30日
yqd123456 LV3
2021年2月2日
maorchao LV11
2020年11月19日
dzcdhj LV4
2020年5月19日
1602749187 LV7
2020年4月15日
gaoleipro LV2
2019年11月6日
killpofeng LV5
2019年11月6日
kuiis66 LV1
2019年8月19日
skipple3 LV39
2019年8月3日
最近浏览更多
gowangbo1 LV6
6月30日
微信网友_6755417394941952
2023年11月28日
暂无贡献等级
yangk_126
2023年3月14日
暂无贡献等级
lemon1900
2022年9月6日
暂无贡献等级
xuexizhuanyong23 LV16
2022年8月7日
陈小灏 LV15
2022年6月1日
wanglinddad LV55
2022年4月15日
zhjwgs LV15
2022年2月22日
haoo123
2022年1月26日
暂无贡献等级
dfkk_love LV11
2021年12月26日