zoukankan      html  css  js  c++  java
  • 上传功能源代码

      1 package com.baidu.ueditor.um;
      2 
      3 import java.io.BufferedInputStream;
      4 import java.io.BufferedOutputStream;
      5 import java.io.BufferedReader;
      6 import java.io.File;
      7 import java.io.FileOutputStream;
      8 import java.io.InputStreamReader;
      9 import java.io.OutputStream;
     10 import java.text.SimpleDateFormat;
     11 import java.util.Arrays;
     12 import java.util.Date;
     13 import java.util.HashMap;
     14 import java.util.Iterator;
     15 import java.util.Random;
     16 
     17 import javax.servlet.http.HttpServletRequest;
     18 
     19 import org.apache.commons.fileupload.FileItemIterator;
     20 import org.apache.commons.fileupload.FileItemStream;
     21 import org.apache.commons.fileupload.FileUploadBase.InvalidContentTypeException;
     22 import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
     23 import org.apache.commons.fileupload.FileUploadException;
     24 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
     25 import org.apache.commons.fileupload.servlet.ServletFileUpload;
     26 import org.apache.commons.fileupload.util.Streams;
     27 
     28 import sun.misc.BASE64Decoder;
     29 
     30 /**
     31 * UEditor文件上传辅助类
     32 * 
     33 */
     34 public class Uploader {
     35 // 输出文件地址
     36 private String url = "";
     37 // 上传文件名
     38 private String fileName = "";
     39 // 状态
     40 private String state = "";
     41 // 文件类型
     42 private String type = "";
     43 // 原始文件名
     44 private String originalName = "";
     45 // 文件大小
     46 private long size = 0;
     47 
     48 private HttpServletRequest request = null;
     49 private String title = "";
     50 
     51 // 保存路径
     52 private String savePath = "upload";
     53 // 文件允许格式
     54 private String[] allowFiles = { ".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".wmv", ".gif", ".png", ".jpg", ".jpeg", ".bmp" };
     55 // 文件大小限制,单位KB
     56 private int maxSize = 10000;
     57 
     58 private HashMap<String, String> errorInfo = new HashMap<String, String>();
     59 
     60 public Uploader(HttpServletRequest request) {
     61 this.request = request;
     62 HashMap<String, String> tmp = this.errorInfo;
     63 tmp.put("SUCCESS", "SUCCESS"); // 默认成功
     64 tmp.put("NOFILE", "未包含文件上传域");
     65 tmp.put("TYPE", "不允许的文件格式");
     66 tmp.put("SIZE", "文件大小超出限制");
     67 tmp.put("ENTYPE", "请求类型ENTYPE错误");
     68 tmp.put("REQUEST", "上传请求异常");
     69 tmp.put("IO", "IO异常");
     70 tmp.put("DIR", "目录创建失败");
     71 tmp.put("UNKNOWN", "未知错误");
     72 }
     73 
     74 public void upload() throws Exception {
     75 boolean isMultipart = ServletFileUpload.isMultipartContent(this.request);
     76 if (!isMultipart) {
     77 this.state = this.errorInfo.get("NOFILE");
     78 return;
     79 }
     80 DiskFileItemFactory dff = new DiskFileItemFactory();
     81 String savePath = this.getFolder(this.savePath);
     82 dff.setRepository(new File(savePath));
     83 try {
     84 ServletFileUpload sfu = new ServletFileUpload(dff);
     85 sfu.setSizeMax(this.maxSize * 1024);
     86 sfu.setHeaderEncoding("utf-8");
     87 FileItemIterator fii = sfu.getItemIterator(this.request);
     88 while (fii.hasNext()) {
     89 FileItemStream fis = fii.next();
     90 if (!fis.isFormField()) {
     91 this.originalName = fis.getName().substring(fis.getName().lastIndexOf(System.getProperty("file.separator")) + 1);
     92 if (!this.checkFileType(this.originalName)) {
     93 this.state = this.errorInfo.get("TYPE");
     94 continue;
     95 }
     96 this.fileName = this.getName(this.originalName);
     97 this.type = this.getFileExt(this.fileName);
     98 this.url = savePath + "/" + this.fileName;
     99 BufferedInputStream in = new BufferedInputStream(fis.openStream());
    100 File file = new File(this.getPhysicalPath(this.url));
    101 FileOutputStream out = new FileOutputStream(file);
    102 BufferedOutputStream output = new BufferedOutputStream(out);
    103 Streams.copy(in, output, true);
    104 this.state = this.errorInfo.get("SUCCESS");
    105 this.size = file.length();
    106 // UE中只会处理单张上传,完成后即退出
    107 break;
    108 } else {
    109 String fname = fis.getFieldName();
    110 // 只处理title,其余表单请自行处理
    111 if (!fname.equals("pictitle")) {
    112 continue;
    113 }
    114 BufferedInputStream in = new BufferedInputStream(fis.openStream());
    115 BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    116 StringBuffer result = new StringBuffer();
    117 while (reader.ready()) {
    118 result.append((char) reader.read());
    119 }
    120 this.title = new String(result.toString().getBytes(),"utf-8");
    121 reader.close();
    122 }
    123 }
    124 } catch (SizeLimitExceededException e) {
    125 this.state = this.errorInfo.get("SIZE");
    126 } catch (InvalidContentTypeException e) {
    127 this.state = this.errorInfo.get("ENTYPE");
    128 } catch (FileUploadException e) {
    129 this.state = this.errorInfo.get("REQUEST");
    130 } catch (Exception e) {
    131 this.state = this.errorInfo.get("UNKNOWN");
    132 }
    133 }
    134 
    135 /**
    136 * 接受并保存以base64格式上传的文件
    137 * 
    138 * @param fieldName
    139 */
    140 public void uploadBase64(String fieldName) {
    141 String savePath = this.getFolder(this.savePath);
    142 String base64Data = this.request.getParameter(fieldName);
    143 this.fileName = this.getName("test.png");
    144 this.url = savePath + "/" + this.fileName;
    145 BASE64Decoder decoder = new BASE64Decoder();
    146 try {
    147 File outFile = new File(this.getPhysicalPath(this.url));
    148 OutputStream ro = new FileOutputStream(outFile);
    149 byte[] b = decoder.decodeBuffer(base64Data);
    150 for (int i = 0; i < b.length; ++i) {
    151 if (b[i] < 0) {
    152 b[i] += 256;
    153 }
    154 }
    155 ro.write(b);
    156 ro.flush();
    157 ro.close();
    158 this.state = this.errorInfo.get("SUCCESS");
    159 } catch (Exception e) {
    160 this.state = this.errorInfo.get("IO");
    161 }
    162 }
    163 
    164 /**
    165 * 文件类型判断
    166 * 
    167 * @param fileName
    168 * @return
    169 */
    170 private boolean checkFileType(String fileName) {
    171 Iterator<String> type = Arrays.asList(this.allowFiles).iterator();
    172 while (type.hasNext()) {
    173 String ext = type.next();
    174 if (fileName.toLowerCase().endsWith(ext)) {
    175 return true;
    176 }
    177 }
    178 return false;
    179 }
    180 
    181 /**
    182 * 获取文件扩展名
    183 * 
    184 * @return string
    185 */
    186 private String getFileExt(String fileName) {
    187 return fileName.substring(fileName.lastIndexOf("."));
    188 }
    189 /**
    190 * 依据原始文件名生成新文件名
    191 * 
    192 * @return
    193 */
    194 private String getName(String fileName) {
    195 Random random = new Random();
    196 return this.fileName = "" + random.nextInt(10000) + System.currentTimeMillis() + this.getFileExt(fileName);
    197 }
    198 /**
    199 * 根据字符串创建本地目录 并按照日期建立子目录返回
    200 * 
    201 * @param path
    202 * @return
    203 */
    204 private String getFolder(String path) {
    205 SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd");
    206 path += "/" + formater.format(new Date());
    207 File dir = new File(this.getPhysicalPath(path));
    208 if (!dir.exists()) {
    209 try {
    210 dir.mkdirs();
    211 } catch (Exception e) {
    212 this.state = this.errorInfo.get("DIR");
    213 return "";
    214 }
    215 }
    216 return path;
    217 }
    218 public static void main(String[] args) {
    219 SimpleDateFormat formater = new SimpleDateFormat("yyyyMMddhhmmss");
    220 String strDate = formater.format(new Date());
    221 System.out.println(strDate);
    222 }
    223 /**
    224 * 根据传入的虚拟路径获取物理路径
    225 * 
    226 * @param path
    227 * @return
    228 */
    229 private String getPhysicalPath(String path) {
    230 String servletPath = this.request.getServletPath();
    231 String realPath = this.request.getSession().getServletContext()
    232 .getRealPath(servletPath);
    233 return new File(realPath).getParent() + "/" + path;
    234 }
    235 
    236 public void setSavePath(String savePath) {
    237 this.savePath = savePath;
    238 }
    239 
    240 public void setAllowFiles(String[] allowFiles) {
    241 this.allowFiles = allowFiles;
    242 }
    243 
    244 public void setMaxSize(int size) {
    245 this.maxSize = size;
    246 }
    247 
    248 public long getSize() {
    249 return this.size;
    250 }
    251 
    252 public String getUrl() {
    253 return this.url;
    254 }
    255 
    256 public String getFileName() {
    257 return this.fileName;
    258 }
    259 
    260 public String getState() {
    261 return this.state;
    262 }
    263 
    264 public String getTitle() {
    265 return this.title;
    266 }
    267 
    268 public String getType() {
    269 return this.type;
    270 }
    271 
    272 public String getOriginalName() {
    273 return this.originalName;
    274 }
    275 }
  • 相关阅读:
    Lua调用C++时打印堆栈信息
    Node.js批量去除BOM文件
    cocos2d-x中CCLabelAtlas的小图片拼接
    node.js使用mysql模块的坑
    关于chrome插件编写的小结
    【吐槽】如风达快递
    bat调用TexturePacker更新SpriteSheet
    使用node-webkit实现打包工具的小结
    使用devenv.exe自动编译项目
    svn导出文件进行比较
  • 原文地址:https://www.cnblogs.com/123456puke/p/7904975.html
Copyright © 2011-2022 走看看