批量选择,批量上传: FancyUpload

批量选择,批量上传: FancyUpload
2010年07月01日
  FancyUpload
  --------------------------------------------------
  1. 介绍:
  FancyUpload是一个采用Flash与Ajax(MooTools)技术实现包含上传进度条的多文件上传组件,类似于SWFUpload。MooTools是一个与prototype相类似的一个Ajax框架。
  主页:http://digitarald.de/projects/
  后台结合使用Servlet响应请求,使用ServletFileUpload(Apache的common-fileupload-1.2.1.jar)处理文件.
  注意common-fileupload的1.2版本后已经废弃DiskFileUpload类,结合使用ServletFileUpload与DiskFileItemFactory替代,具体过渡代码看API中Package org.apache.commons.fileupload的描述中介绍.
  关键点:
  (1)DiskFileItemFactory设置缓存sizeThreshold,设置临时库repository(当缓存溢出会自动写到repository的某个文件).
  (2)ServletFileUpload设置全部文件大小sizeMax,设置单件文件大小fileSizeMax,解析request获取FileItem List,此后逐个FileItem处理.
  注意:有些FileItme的getName()返回null,表示某些状态信息而非上传文件,此时应该忽略,否则一个文档会在上传目录生成2个文件.(令人费解!令人咋舌!)
  for (Iterator iter = fileItemList.iterator(); iter.hasNext();) {
  FileItem item = (FileItem) iter.next();
  String fileName = item.getName();
  if (fileName == null) {
  continue;
  }
  File file = new File(dir, fileName);
  item.write(file);
  }
  //2010年7月1日
  上面代码理解代码,应该使用FileItme.isFormField判断是否文件表单字段.
  API: isFormField 方法 isFormField 方法用于判断 FileItem 类对象封装的数据是否属于一个普通表单字段, 还是属 于一个文件表单字段,如果是普通表单字段则返回 true,否则返回 false.
  for (Iterator iter = fileItemList.iterator(); iter.hasNext();) {
  FileItem item = (FileItem) iter.next();
  if(item.isFormField()){
  continue;
  }
  String fileName = item.getName();
  File file = new File(dir, fileName);
  item.write(file);
  }
  (3)Servlet必须返回状态信息给FancyUpload,否则会Timeout.状态信息使用JSON格式编码,具体内容至少包含status,0表示失败,1表示成功.
  {"status":"0"}或{"status":"1"}
  必须注意,JSON中的属性名是String类型,必须用""括住.
  //2010年7月1日
  具体showcase可能不同,根据相应的script.php对译为Java即可.
  2. 使用:
  (1)多文件选择,多文件上传,而不是通过Queue逐个上传.个人感觉这点好于SWFUpload.
  (2)配置简单,根据需要修改类同showcase即可.
  (3)版本跨越大. V2与V3基本不兼容.相关文章可在主页找到.
  3. 注意事项:
  (1)单独使用,基本OK,没有问题.
  (2)集成使用,目前发现和A4J/Richfaces的JS类库冲突,具体原因可能是A4J/Richfaces使用prototype,而FancyUpload使用mootools.这二个JS类库某些全局变量冲突,特别是$的占用问题.暂时未找到合适解决.
  
  
  (3)后台处理,FancyUpload的后台必须返回状态信息确认上传结果,否则老是timeout.
  4. 示例源码:
  下载http://github.com/downloads/digitarald/digitarald-fancyupload/fancyupload-complete-source.zip,修改Attach-a-file的showcase,然后从photoqueue的showcase引用图片相关配置.
  --------------build.xml(即build.php)---------------
  
  
  http://www.w3.org/1999/xhtml">
  
  
  
  
  
  
  
  //
  
  
  
  a.hover {
  color: red;
  }
  #demo-list {
  padding: 0;
  list-style: none;
  margin: 0;
  }
  #demo-list .file-invalid {
  cursor: pointer;
  color: #514721;
  padding-left: 48px;
  line-height: 24px;
  background: url(assets/error.png) no-repeat 24px 5px;
  margin-bottom: 1px;
  }
  #demo-list .file-invalid span {
  background-color: #fff6bf;
  padding: 1px;
  }
  #demo-list .file {
  line-height: 2em;
  padding-left: 22px;
  background: url(assets/attach.png) no-repeat 1px 50%;
  }
  #demo-list .file span,
  #demo-list .file a {
  padding: 0 4px;
  }
  #demo-list .file .file-size {
  color: #666;
  }
  #demo-list .file .file-error {
  color: #8a1f11;
  }
  #demo-list .file .file-progress {
  width: 125px;
  height: 12px;
  vertical-align: middle;
  background-image: url(source/progress.gif);
  }
  
  
  
  
  Choose...
  
  More...
  
  
  
  -----------------Java后台(借助Apache的Common-Upload)----------------
  public class FileUploadServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  public static final String UPLOAD_ID = "uid";
  public static final String UPLOAD_SIZE_THRESHOLD = "upload.size.threshold";
  public static final String UPLOAD_REPOSITORY = "upload.repository";
  public static final String UPLOAD_FILE_BASE_PATH = "upload.file.base.path";
  public static final String UPLOAD_FILE_SIZE_MAX = "upload.file.size.max";
  protected int sizeThreshold;
  protected File repository;
  protected File fileBasePath;
  protected long fileSizeMax;
  @Override
  public void init() throws ServletException {
  String sizeThresholdStr = this.getInitParameter(UPLOAD_SIZE_THRESHOLD);
  if (sizeThresholdStr != null) {
  this.sizeThreshold = Integer.parseInt(sizeThresholdStr);
  }
  String repositoryStr = this.getInitParameter(UPLOAD_REPOSITORY);
  if (repositoryStr == null) {
  repositoryStr = getServletContext().getRealPath("/temp");
  }
  this.repository = new File(repositoryStr);
  if (!this.repository.exists()) {
  this.repository.mkdirs();
  }
  String fileBasePathStr = this.getInitParameter(UPLOAD_FILE_BASE_PATH);
  if (fileBasePathStr == null) {
  fileBasePathStr = getServletContext().getRealPath("/upload");
  }
  this.fileBasePath = new File(fileBasePathStr);
  if (!this.fileBasePath.exists()) {
  this.fileBasePath.mkdirs();
  }
  String fileSizeMaxStr = this.getInitParameter(UPLOAD_FILE_SIZE_MAX);
  if (fileSizeMaxStr != null) {
  this.fileSizeMax = Long.parseLong(fileSizeMaxStr);
  }
  }
  @SuppressWarnings("unchecked")
  @Override
  protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
  /*
  * if not multipart/form-data, it return;
  */
  if (!ServletFileUpload.isMultipartContent(request)) {
  return;
  }
  Map result = new HashMap();
  /*
  * create FileItemFactory
  */
  DiskFileItemFactory factory = new DiskFileItemFactory();
  if (FileUploadServlet.this.sizeThreshold > 0) {
  factory.setSizeThreshold(FileUploadServlet.this.sizeThreshold);
  }
  factory.setRepository(FileUploadServlet.this.repository);
  /*
  * create ServletFileUpload
  */
  ServletFileUpload upload = new ServletFileUpload(factory);
  if (FileUploadServlet.this.fileSizeMax > 0) {
  upload.setFileSizeMax(FileUploadServlet.this.fileSizeMax);
  }
  /*
  * process FileItems
  */
  String uid = request.getParameter(UPLOAD_ID);
  File dir = new File(FileUploadServlet.this.fileBasePath, uid);
  if (!dir.exists()) {
  dir.mkdirs();
  }
  try {
  List fileItemList = upload.parseRequest(request);
  for (Iterator iter = fileItemList.iterator(); iter.hasNext();) {
  FileItem item = (FileItem) iter.next();
  String fileName = item.getName();
  if (fileName == null) {
  continue;
  }
  File file = new File(dir, fileName);
  item.write(file);
  }
  result.put("status", 1);
  } catch (Exception e) {
  result.put("status", 0);
  }
  response.setContentType("application/json");
  PrintWriter out = response.getWriter();
  out.write(FileUploadServlet.this.jsonEncode(result));
  out.flush();
  }
  private String jsonEncode(Map result) {
  StringBuilder sb = new StringBuilder();
  sb.append("{");
  for (Iterator> iter = result.entrySet().iterator(); iter.hasNext();) {
  Map.Entry entry = iter.next();
  sb.append("\"").append(entry.getKey()).append("\"").append(":").append("\"").append(entry.getValue()).append("\"");
  if (iter.hasNext()) {
  sb.append(",");
  }
  }
  sb.append("}");
  return sb.toString();
  }
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值