十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
前言
創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站設(shè)計、網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元土默特左旗做網(wǎng)站,已為上家服務(wù),為土默特左旗各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220之前項目需要上傳大文件的功能,上傳大文件經(jīng)常遇到上傳一半由于網(wǎng)絡(luò)或者其他一些原因上傳失敗。然后又得重新上傳(很麻煩),所以就想能不能做個斷點上傳的功能。于是網(wǎng)上搜索,發(fā)現(xiàn)市面上很少有斷點上傳的案例,有找到一個案例也是采用SOCKET作為上傳方式(大文件上傳,不適合使用POST,GET形式)。由于大文件夾不適合http上傳的方式,所以就想能不能把大文件切割成n塊小文件,然后上傳這些小文件,所有小文件全部上傳成功后再在服務(wù)器上進(jìn)行拼接。這樣不就可以實現(xiàn)斷點上傳,又解決了http不適合上傳大文件的難題了嗎?。?!
原理分析
Android客戶端
首先,android端調(diào)用服務(wù)器接口1,參數(shù)為filename(服務(wù)器標(biāo)識判斷是否上傳過)
如果存在filename,說明之前上傳過,則續(xù)傳;如果沒有,則從零開始上傳。
然后,android端調(diào)用服務(wù)器接口2,傳入?yún)?shù)name,chunck(傳到第幾塊),chuncks(總共多少塊)
服務(wù)器端
接口一:根據(jù)上傳文件名稱filename 判斷是否之前上傳過,沒有則返回客戶端chunck=1,有則讀取記錄chunck并返回。
接口二:上傳文件,如果上傳塊數(shù)chunck=chuncks,遍歷所有塊文件拼接成一個完整文件。
服務(wù)端源代碼
服務(wù)器接口1
@WebServlet(urlPatterns = { "/ckeckFileServlet" }) public class CkeckFileServlet extends HttpServlet { private FileUploadStatusServiceI statusService; String repositoryPath; String uploadPath; @Override public void init(ServletConfig config) throws ServletException { ServletContext servletContext = config.getServletContext(); WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext); statusService = (FileUploadStatusServiceI) context.getBean("fileUploadStatusServiceImpl"); repositoryPath = FileUtils.getTempDirectoryPath(); uploadPath = config.getServletContext().getRealPath("datas/uploader"); File up = new File(uploadPath); if (!up.exists()) { up.mkdir(); } } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String fileName = new String(req.getParameter("filename")); //String chunk = req.getParameter("chunk"); //System.out.println(chunk); System.out.println(fileName); resp.setContentType("text/json; charset=utf-8"); TfileUploadStatus file = statusService.get(fileName); try { if (file != null) { int schunk = file.getChunk(); deleteFile(uploadPath + schunk + "_" + fileName); //long off = schunk * Long.parseLong(chunkSize); resp.getWriter().write("{\"off\":" + schunk + "}"); } else { resp.getWriter().write("{\"off\":1}"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }