DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> 基於WebUploader的文件上傳js插件
基於WebUploader的文件上傳js插件
編輯:關於JavaScript     

首先把地址甩出來,http://fex-team.github.io/webuploader/ 

裡面有比較完整的demo案例文檔,本文主要是基於文件上傳和圖片上傳增加了大量的注釋,基本保證了每行代碼都有注釋以助於理解,是對官網demo的增強版,希望可以幫助大家更好的理解該插件

首先是文件上傳

jQuery(function() {
 var $ = jQuery,
  $list = $('#thelist'),
  $btn = $('#ctlBtn'),
  state = 'pending',
  uploader;

 //初始化,實際上可直接訪問Webuploader.upLoader
 uploader = WebUploader.create({

  // 不壓縮image
  resize: false,

  // swf文件路徑
  swf: BASE_URL + '/js/Uploader.swf',

  // 發送給後台代碼進行處理,保存到服務器上
  server: 'http://webuploader.duapp.com/server/fileupload.php',

  // 選擇文件的按鈕。可選。
  // 內部根據當前運行是創建,可能是input元素,也可能是flash.
  pick: '#picker'
 });

 // uploader添加事件,當文件被加入隊列後觸發
 uploader.on( 'fileQueued', function( file ) {
 //在加入隊列時,創建一個樣式,供後面上傳成功失敗等等調用,定義一個*p表示指向該事件樣式
  $list.append( '<div id="' + file.id + '" class="item">' +
   '<h4 class="info">' + file.name + '</h4>' +
   '<p class="state">等待上傳...</p>' +
  '</div>' );
 });

 // 文件上傳過程中觸發,攜帶上傳進度,file表示上傳的文件,percentage表示上傳的進度
 uploader.on( 'uploadProgress', function( file, percentage ) {
 //定義一個變量名創建進度模塊
  var $li = $( '#'+file.id ),
 //找到$li下class為progress的,並定義為$percent------為什麼先尋找在創建
   $percent = $li.find('.progress .progress-bar');

  //如果$percent沒值,就創建進度條加入到對應的文件名下, 避免重復創建
  if ( !$percent.length ) {
   $percent = $('<div class="progress progress-striped active">' +
    '<div class="progress-bar" role="progressbar" style="width: 0%">' +
    '</div>' +
   '</div>').appendTo( $li ).find('.progress-bar');
  }
 
 //為進度模塊添加彈出文本
  $li.find('p.state').text('上傳中');
 
 //為進度模塊創建讀條的百分比
  $percent.css( 'width', percentage * 100 + '%' );
 });

 //uploader觸發事件,當上傳成功事調用這個事件
 uploader.on( 'uploadSuccess', function( file ) {
 //調用文件被加入時觸發的事件,findstate,並添加文本為已上傳
  $( '#'+file.id ).find('p.state').text('已上傳');
 });

 //uploader觸發事件,當上傳失敗時觸發該事件
 uploader.on( 'uploadError', function( file ) {
 //調用文件被加入時觸發的事件,findstate,並添加文本為上傳出錯
  $( '#'+file.id ).find('p.state').text('上傳出錯');
 });
 
 //該事件表示不管上傳成功還是失敗都會觸發該事件
 uploader.on( 'uploadComplete', function( file ) {
 //調用
  $( '#'+file.id ).find('.progress').fadeOut();
 });

 //這是一個特殊事件,所有的觸發都會響應到,type的作用是記錄當前是什麼事件在觸發,並給state賦值
 uploader.on( 'all', function( type ) {
  if ( type === 'startUpload' ) {
   state = 'uploading';
  } else if ( type === 'stopUpload' ) {
   state = 'paused';
  } else if ( type === 'uploadFinished' ) {
   state = 'done';
  }
 
 //根據state判斷彈出文本
  if ( state === 'uploading' ) {
   $btn.text('暫停上傳');
  } else {
   $btn.text('開始上傳');
  }
 });
 
 //當按鈕被點擊時觸發,根據狀態開始上傳或是暫停
 $btn.on( 'click', function() {
  if ( state === 'uploading' ) {
   uploader.stop();
  } else {
   uploader.upload();
  }
 });
});

 然後是圖片上傳

jQuery(function() {

 //將jquery賦值給一個全局的變量
 var $ = jQuery,

  $list = $('#fileList'),
  // 優化retina, 在retina下這個值是2,設備像素比
  ratio = window.devicePixelRatio || 1,

  // 縮略圖大小
  thumbnailWidth = 100 * ratio,
  thumbnailHeight = 100 * ratio,

  // Web Uploader實例
  uploader;

 // 初始化Web Uploader
 uploader = WebUploader.create({

  // 自動上傳。
  auto: true,

  // swf文件路徑
  swf: BASE_URL + '/js/Uploader.swf',

  // 文件接收服務端。調用代碼,把圖片保存在服務器端
  server: 'http://webuploader.duapp.com/server/fileupload.php',

  // 選擇文件的按鈕。可選。
  // 內部根據當前運行是創建,可能是input元素,也可能是flash.
  pick: '#filePicker',

  // 只允許選擇文件,可選。
  accept: {
   title: 'Images',
   extensions: 'gif,jpg,jpeg,bmp,png',
   mimeTypes: 'image/*'
  }
 });

 // 當有文件添加進來的時候觸發這個事件
 uploader.on( 'fileQueued', function( file ) {
 //定義變量li
  var $li = $(
 //創建一個id
    '<div id="' + file.id + '" class="file-item thumbnail">' +
     '<img>' +
  //創建一個為info的class
     '<div class="info">' + file.name + '</div>' +
    '</div>'
    ),
   $img = $li.find('img');
 
 //把定義的li加入到list中
  $list.append( $li );

  // 創建縮略圖,此過程為異步,需要傳入callBack(function( error, src )),通常在圖片加入隊列後調用此方法,以增強交互性
 //callback有兩個參數,當失敗時調用error,src存放的是縮略圖的地址
  uploader.makeThumb( file, function( error, src ) {
   if ( error ) {
    $img.replaceWith('<span>不能預覽</span>');
    return;
   }

   $img.attr( 'src', src );
  }, thumbnailWidth, thumbnailHeight );
 });

 // 文件上傳過程中創建進度條實時顯示。
 uploader.on( 'uploadProgress', function( file, percentage ) {
  var $li = $( '#'+file.id ),
   $percent = $li.find('.progress span');

  // 避免重復創建
  if ( !$percent.length ) {
   $percent = $('<p class="progress"><span></span></p>')
     .appendTo( $li )
     .find('span');
  }

  $percent.css( 'width', percentage * 100 + '%' );
 });

 // 文件上傳成功,給item添加成功class, 用樣式標記上傳成功。
 uploader.on( 'uploadSuccess', function( file ) {
  $( '#'+file.id ).addClass('upload-state-done');
 });

 // 文件上傳失敗,現實上傳出錯。
 uploader.on( 'uploadError', function( file ) {
  var $li = $( '#'+file.id ),
   $error = $li.find('div.error');

  // 避免重復創建
  if ( !$error.length ) {
   $error = $('<div class="error"></div>').appendTo( $li );
  }

  $error.text('上傳失敗');
 });

 // 完成上傳完了,成功或者失敗,先刪除進度條。
 uploader.on( 'uploadComplete', function( file ) {
  $( '#'+file.id ).find('.progress').remove();
 });
});

 下面是java的後台代碼,用於獲取上傳文件,並將上傳文件的真實路徑寫入服務器 

1.首先我們應該為上傳的文件建一個存放的位置,一般位置分為臨時和真是文件夾,那我們就需要獲取這倆個文件夾的絕對路徑,在servlet中我們可以這樣做 

 ServletContext application = this.getServletContext();
 String tempDirectory = application.getRealPath(Constant.TEMP_DIRECTORY) + "/";
 String realDirectory = application.getRealPath(Constant.REAL_DIRECTORY) + "/";

 然後建立文件工廠即倉庫一個參數表示存放多大後flush,

  復制代碼 代碼如下:FileItemFactory factory = new DiskFileItemFactory(Constant.SIZE_THRESHOLD,new File(tempDirectory));
  ServletFileUpload upload = new ServletFileUpload(factory);

2.對上傳的文件進行設定

  upload.setSizeMax(500*1024*1024);//設置該次上傳最大值為500M3,.解析請求正文,獲取上傳文件,不拋出異常則寫入真是路徑

List<FileItem> list = upload.parseRequest(request);
 Iterator<FileItem> iter = list.iterator();
 while (iter.hasNext()) {
 FileItem item = iter.next();
 //item.isFormField()用來判斷當前對象是否是file表單域的數據 如果返回值是true說明不是 就是普通表單域
 if(item.isFormField()){
  System.out.println( "普通表單域" +item.getFieldName());
  System.out.println(item.getString("utf-8"));

 }else{
  //System.out.println("file表單域" + item.getFieldName());
  /*
  * 只有file表單域才將該對象中的內容寫到真實文件夾中 
  */
  String lastpath = item.getName();//獲取上傳文件的名稱
  lastpath = lastpath.substring(lastpath.lastIndexOf("."));
  String filename = UUID.randomUUID().toString().replace("-", "") + lastpath;
  item.write(new File(realDirectory+filename));

package com.lanyou.support.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;

public class FileUpload extends HttpServlet {

 private static final long serialVersionUID = 1L;
 private static Log logger = LogFactory.getLog(FileUpload.class);

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
 throws ServletException, IOException {
 doPost(req, resp);
 }

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
 throws ServletException, IOException {
 // 類型 1事件上傳文件 2apk
 String t = req.getParameter("t") == null ? "1" : req.getParameter("t")
 .trim();
 String path = "";
 JSONObject ob = new JSONObject();
 try {
 
 //將請求消息中的每一個項目封裝成單獨DiskFileItem對象的任務
 //當上傳的文件項目比較小時保存在內存中,比較大時保存在磁盤零時文件夾中
 //建立文件倉庫(工廠)
 FileItemFactory factory = new DiskFileItemFactory();
 ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
 //對上傳的文件進行設定
 servletFileUpload.setSizeMax(1024 * 1024 * 2);// 最大2M數據
 servletFileUpload.setFileSizeMax(2 * 1024 * 1024);

 servletFileUpload.setHeaderEncoding("UTF-8");// 解決文件名亂碼的問題
 
 //解析請求正文,獲取上傳文件,不拋出異常則寫入真實路徑
 //根據請求獲取文件列表
 List<FileItem> fileItemsList = servletFileUpload.parseRequest(req);
 //從文件列表中取出單獨的文件對象
 for (FileItem item : fileItemsList) {
 //判斷該文件是否是普通的表單類型,該處是file類型進入判斷
 if (!item.isFormField()) {
 //如果上傳的文件大於指定的大小則return
 if (item.getSize() > 2 * 1024 * 1024) {
 return;
 }

 // System.out.println("上傳文件的大小:"+item.getSize());
 // System.out.println("上傳文件的類型:"+item.getContentType());
 // System.out.println("上傳文件的名稱:"+item.getName());
 
 
 //上傳文件的名稱
 String fileName = item.getName();

 String ent = "";
 //內容的類型
 if (item.getContentType().equalsIgnoreCase("image/x-png")
 || item.getContentType().equalsIgnoreCase(
  "image/png")) {
 ent = ".png";
 } else if (item.getContentType().equalsIgnoreCase(
 "image/gif")) {
 ent = ".gif";
 } else if (item.getContentType().equalsIgnoreCase(
 "image/bmp")) {
 ent = ".bmp";
 } else if (item.getContentType().equalsIgnoreCase(
 "image/pjpeg")
 || item.getContentType().equalsIgnoreCase(
  "image/jpeg")) {
 ent = ".jpg";
 }
 
 //獲取文件的是那種格式
 if (fileName.lastIndexOf(".") != -1) {
 ent = fileName.substring(fileName.lastIndexOf("."));
 }
 fileName = "ev_" + System.currentTimeMillis() + ent;
 // 定義文件路徑,根據你的文件夾結構,可能需要做修改
 if (t.equals("1")) {
 path = "upload/ev/" + fileName;
 } else {
 path = "upload/pk/" + fileName;
 }

 // 保存文件到服務器上
 File file = new File(req.getSession().getServletContext()
 .getRealPath(path));
 if (!file.getParentFile().exists()) {
 file.getParentFile().mkdirs();
 }
 item.write(file);
 // logger.info(path);
 // break;
 ob.accumulate("url", path);
 }
 }

 resp.setContentType("text/html; charset=UTF-8");
 resp.getWriter().write(ob.toString());
 } catch (Exception e) {
 e.printStackTrace();
 } finally {
 // 響應客戶端
 // resp.setContentType("text/html; charset=UTF-8");
 // resp.getWriter().write(ob.toString());
 }
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved