對阿里雲OSS上傳小文件時的進度,想過兩個方法:一是。經過多線程監測Inputstream剩餘的字節數來計算,但是因爲Inputstream在兩個線程中共用,假設上傳線程將Inputstream關閉,在監測線程就會報「句柄無效」的錯誤,甚至會致使上傳失敗;第二個方法是經過線程不斷監測OSS上已經上傳文件的大小,但是在文件全然上傳前是不能得到文件大小的。
最後忽然靈感來了,把兩個方法同一時候使用就行監測文件上傳的進度。看代碼: java
// 上傳小文件 private static void uploadSmallFile(final OSSClient client, final String bucketName, final String key, final File uploadFile) throws OSSException, ClientException, FileNotFoundException { ObjectMetadata objectMeta = new ObjectMetadata(); objectMeta.setContentLength(uploadFile.length()); // 能夠在metadata中標記文件類型 objectMeta.setContentType("application/pdf"); //對object進行服務器端加密。眼下服務器端僅僅支持x-oss-server-side-encryption加密 objectMeta.setHeader("x-oss-server-side-encryption", "AES256"); final InputStream input = new FileInputStream(uploadFile); Thread t = new Thread(new Runnable() { @Override public void run() { InputStream tmpInput = null; while(true){ //將input緩存在tmpInput中,防止在調用available()方法是異常致使上傳失敗 tmpInput = input; try { Thread.sleep(1000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { if(input!=null){ System.out.println(uploadFile.getName()+"的上傳進度爲"+(float)(uploadFile.length()-tmpInput.available())/uploadFile.length()); if(tmpInput.available() == 0){ break; } }else{ break; } } catch (IOException e) { break; } } //經過獲取oss上文件的大小來推斷是否上傳成功,假設不能從oss得到文件的大小說明上傳失敗 try{ ObjectMetadata tmpObjectMeta = client.getObjectMetadata(bucketName, key); System.out.println(uploadFile.getName()+"的上傳進度爲:"+tmpObjectMeta.getContentLength()/uploadFile.length()); }catch(Exception e){ e.printStackTrace(); System.out.println(uploadFile.getName()+"上傳失敗"); } } }); t.start(); PutObjectResult result =client.putObject(bucketName, key, input, objectMeta); String md5 = null; try { md5 = DigestUtils.md5Hex(new FileInputStream(uploadFile)); System.out.println("MD5:"+ md5); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("上傳的object返回的E_tag:"+result.getETag()); System.out.println("上傳是否成功:"+ md5.equalsIgnoreCase(result.getETag())); }