JS異步文件分片斷點上傳的實現(xiàn)思路
在項目中有時會遇到大文件上傳,經(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)站的支持!
- 使用Chrome調(diào)試JavaScript的斷點設(shè)置和調(diào)試技巧
- 使用Firebug對js進行斷點調(diào)試的圖文方法
- js調(diào)試系列 斷點與動態(tài)調(diào)試[基礎(chǔ)篇]
- 基于JavaScript實現(xiàn)前端文件的斷點續(xù)傳
- javascript調(diào)試之DOM斷點調(diào)試法使用技巧分享
- JavaScript代碼判斷點擊第幾個按鈕
- Chrome調(diào)試折騰記之JS斷點調(diào)試技巧
- 前端js實現(xiàn)文件的斷點續(xù)傳 后端PHP文件接收
- chrome瀏覽器如何斷點調(diào)試異步加載的JS
- JavaScript指定斷點操作實例教程
相關(guān)文章
js中checkbox的使用教程(取值、賦值、判斷是否選中)
在checkbox的使用中,我們經(jīng)常遇到需要全選或者單選的情況,下面這篇文章主要給大家介紹了關(guān)于js中checkbox使用(取值、賦值、判斷是否選中)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07JavaScript實現(xiàn)將Word文檔解析成瀏覽器認(rèn)識的HTML
這篇文章主要為大家詳細介紹了如何使用JavaScript實現(xiàn)將Word文檔解析成瀏覽器認(rèn)識的HTML,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2024-02-02Chrome不支持showModalDialog模態(tài)對話框和無法返回returnValue問題的解決方法
上個禮拜修改測試一個后臺管理項目,在測試與各個瀏覽器兼容性的時候,發(fā)現(xiàn)在chrome瀏覽器下showModalDialog方法顯示的并不是模態(tài)對話框,就像新打開一個頁面一樣,父窗口仍然可以隨意獲取焦點,并可以打開多個窗體,而且返回值returnValue也無法返回,一直是undefined2016-10-10