欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS異步文件分片斷點上傳的實現(xiàn)思路

 更新時間:2016年12月25日 17:39:14   作者:u283056051  
在項目中有時會遇到大文件上傳,經(jīng)常會出現(xiàn)鏈接超時的問題,所以就需要使用文件分片上傳的方式來上傳大文件。下面通過本文給大家介紹js異步文件分片斷點上傳的實例代碼,需要的的朋友參考下吧

在項目中有時會遇到大文件上傳,經(jīng)常會出現(xiàn)鏈接超時的問題,所以就需要使用文件分片上傳的方式來上傳大文件。實現(xiàn)原理就是,在前端將文件分成指定大小的“文件塊”,分成多次上傳,每次上傳前先向后臺查詢已經(jīng)上傳成功的文件的大小,然后從指定的位置切割一塊文件,進行上傳,后臺接收到文件塊后追加到指定的文件中。

這篇博客適合有一些后臺基礎(chǔ)的朋友,或者有后臺配合的前端。

這里需要后臺提供兩個接口,一個上傳文件的接口,一個查詢已上傳文件大小的接口。

前端代碼:https://github.com/li5454yong/FileUpload.git

這里放上后臺主要代碼

package com.fs.controller;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.Iterator;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.csource.ClientGlobal;
import org.csource.common.MyException;
import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.junit.Test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import com.alibaba.fastjson.JSON;
import com.fs.entity.UploadedFileInfo;
import com.fs.util.UploadUtil;
/**
 * @author admin
 *
 * 2016年12月20日下午8:59:38
 */
@Controller
public class FastDFSUpLoadController {
 @Resource
 private UploadUtil uploadUtil;
 @RequestMapping(value = "v1/uploadSize", method = RequestMethod.POST)
 @ResponseBody
 public Long uploadSize(HttpServletRequest request) {
  String name = request.getParameter("name");
  Long size = Long.parseLong(request.getParameter("size"));
  try {
   JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.0.12");
   Jedis jedis = new Jedis(jedisShardInfo);
   String str = jedis.get(name);
   UploadedFileInfo uploadedFileInfo = null;
   // 如果首次上傳,已上傳大小為 0
   if (StringUtils.isEmpty(str)) {
    uploadedFileInfo = new UploadedFileInfo();
    jedis.set(name, JSON.toJSONString(uploadedFileInfo));
    jedis.close();
    return 0L;
   }
   uploadedFileInfo = JSON.parseObject(str, UploadedFileInfo.class);
   jedis.close();
   //已經(jīng)全部上傳
   if(size <= uploadedFileInfo.getSize()){
    System.out.println("上傳完成");
   }
    //UploadUtil.getFileInfo(uploadedFileInfo.getFileId());
   return uploadedFileInfo.getSize();
  } catch (Exception e) {
   e.printStackTrace();
   return 0L;
  }
 }
 @RequestMapping(value = "v1/uploadFile", method = RequestMethod.POST)
 @ResponseBody
 public int upload(HttpServletRequest request) {
  // CommonsMultipartResolver resolver = new
  // CommonsMultipartResolver(request.getSession().getServletContext());
  MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
  Iterator<String> t = multiRequest.getFileNames();
  MultipartFile fileDetail = multiRequest.getFile(t.next());
  String name = request.getParameter("name");
  JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.0.12");
  Jedis jedis = new Jedis(jedisShardInfo);
  UploadedFileInfo uploadedFileInfo = JSON.parseObject(jedis.get(name), UploadedFileInfo.class);
  uploadedFileInfo.setFileName(name);
  String path = "d:/testUpload";
  File file = new File(path);
  if (!file.exists() && !file.isDirectory()) {
   boolean b = file.mkdirs();
  }
  RandomAccessFile randomFile = null;
  try {
   randomFile = new RandomAccessFile(path+"/"+name, "rw");
   randomFile.seek(randomFile.length());
   randomFile.write(fileDetail.getBytes());
   uploadedFileInfo.setLocalPath(path+"/"+name);
   uploadedFileInfo.setSize(randomFile.length());
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   try {
    randomFile.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  // 將上傳文件信息保存到redis
  jedis.set(name, JSON.toJSONString(uploadedFileInfo));
  jedis.close();
  return 0;
 }
}

以上所述是小編給大家介紹的JS異步文件分片斷點上傳的實現(xiàn)思路,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • bootstrap輸入框組使用方法

    bootstrap輸入框組使用方法

    這篇文章主要為大家詳細介紹了bootstrap輸入框組的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 淺談js中test()函數(shù)在正則中的使用

    淺談js中test()函數(shù)在正則中的使用

    下面小編就為大家?guī)硪黄獪\談js中test()函數(shù)在正則中的使用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • js中checkbox的使用教程(取值、賦值、判斷是否選中)

    js中checkbox的使用教程(取值、賦值、判斷是否選中)

    在checkbox的使用中,我們經(jīng)常遇到需要全選或者單選的情況,下面這篇文章主要給大家介紹了關(guān)于js中checkbox使用(取值、賦值、判斷是否選中)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • JavaScript中if嵌套assert的方法詳解

    JavaScript中if嵌套assert的方法詳解

    在JavaScript中,通常我們不會直接使用`assert`這個詞,因為JavaScript標(biāo)準(zhǔn)庫中并沒有直接提供`assert`函數(shù),下面是一個詳細的示例,展示如何在JavaScript中模擬`assert`函數(shù),并在`if`語句中嵌套使用它來檢查條件,需要的朋友可以參考下
    2024-09-09
  • js中settimeout方法加參數(shù)的使用實例

    js中settimeout方法加參數(shù)的使用實例

    這篇文章主要介紹了js中settimeout方法加參數(shù)的使用,需要的朋友可以參考下
    2014-02-02
  • JS限制輸入框輸入的實現(xiàn)代碼

    JS限制輸入框輸入的實現(xiàn)代碼

    這篇文章主要介紹了JS限制輸入框輸入的實現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • JavaScript實現(xiàn)將Word文檔解析成瀏覽器認(rèn)識的HTML

    JavaScript實現(xiàn)將Word文檔解析成瀏覽器認(rèn)識的HTML

    這篇文章主要為大家詳細介紹了如何使用JavaScript實現(xiàn)將Word文檔解析成瀏覽器認(rèn)識的HTML,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2024-02-02
  • 詳解JS判斷頁面是在手機端還是在PC端打開的方法

    詳解JS判斷頁面是在手機端還是在PC端打開的方法

    這篇文章主要介紹了JS判斷頁面是手機端還是在PC端打開的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JS模擬簡易滾動條效果代碼(附demo源碼)

    JS模擬簡易滾動條效果代碼(附demo源碼)

    這篇文章主要介紹了JS模擬簡易滾動條效果代碼,可模擬出滾動條拖動顯示的效果,涉及JavaScript鼠標(biāo)事件的響應(yīng)及頁面元素運算的相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2016-04-04
  • Chrome不支持showModalDialog模態(tài)對話框和無法返回returnValue問題的解決方法

    Chrome不支持showModalDialog模態(tài)對話框和無法返回returnValue問題的解決方法

    上個禮拜修改測試一個后臺管理項目,在測試與各個瀏覽器兼容性的時候,發(fā)現(xiàn)在chrome瀏覽器下showModalDialog方法顯示的并不是模態(tài)對話框,就像新打開一個頁面一樣,父窗口仍然可以隨意獲取焦點,并可以打開多個窗體,而且返回值returnValue也無法返回,一直是undefined
    2016-10-10

最新評論