阿里云 oss 小文件上传进度显示

对阿里云OSS上传小文件时的进度,想过两个方法:一是。通过多线程监測Inputstream剩余的字节数来计算,可是由于Inputstream在两个线程中共用,假设上传线程将Inputstream关闭,在监測线程就会报“句柄无效”的错误,甚至会导致上传失败;第二个方法是通过线程不断监測OSS上已经上传文件的大小,可是在文件全然上传前是不能获得文件大小的。
最后突然灵感来了,把两个方法同一时候使用就行监測文件上传的进度。

看代码:         
// 上传小文件
    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()));
    }

				
时间: 2024-08-09 16:41:50

阿里云 oss 小文件上传进度显示的相关文章

PHP阿里云OSS,七牛云 上传文件

来源:http://my.oschina.net/rain21/blog/477019 七牛云 PHPSDK下载:http://pan.baidu.com/s/1o69TGcM 7.X版本: DEMO: <?php require_once './vendor/autoload.php';   use Qiniu\Auth; use Qiniu\Storage\BucketManager; use Qiniu\Storage\UploadManager;   $accessKey = 'acce

阿里云域名及文件上传位置

以centos7.2为例. 阿里云域名备案后,还要购买阿里云服务器搭建网站,如果是新手,建议按照阿里云帮助文档里的搭建wordpress教程来完成网站环境的搭建.搭建好网站环境后,就是代码上传到哪个文件目录才能用(域名/文件名)进行访问的问题了.我的网站是phpwind,所以文件只有上传到phpwind这个目录中才能被访问,否则会出现文件找不着的错误.其实phpwind就是网站的根目录.如下图,只有文件上传到/alidata/www/phpwind中才能被访问.

阿里云oss,简单上传

描述:oss比较方便,省去了自己搭建文件服务器的时间,价格比较便宜,下面是java基于oss的简单上传代码 a.添加maven依赖 <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.1.0</version> </dependency> b.java代码 public

[转]文件上传进度显示

原文: http://www.codeguru.com/java/article.php/c13913/AJAX-File-Upload-Progress-for-Java.htm#page-1 文件上传需要用到commons-fileupload-1.2.1.jar 首先创建一个FileUploadServlet文件 1 package com.psclistens.ajax.fileupload; 2 3 import java.io.File; 4 import java.io.IOExc

python2系列 接入阿里云oss sdk 实现上传脚本,亲测

公司图片要从原有的nfs存储上迁移到oss存储上,其实阿里云提供的很多种方式,但是作为一枚运维人员很有必要学会使用ossutil工具,当然接入阿里oss的python的sdk也是很有必要的,下面我就将我写的简单的脚本样例晒一下: #! /usr/bin/env python #! -*- coding:utf8 -*- """ aliyujn oss2 python sdk 上传测试测试!!""" from __future__ import p

【原创】用JAVA实现大文件上传及显示进度信息

用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息. 而.NET 中使用HtmlInputFile/ HttpPostedFile对象处理二进制文件信息. 优点:使用框架内置对象可以很方便的

基于HT for Web矢量实现HTML5文件上传进度条

在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条,矢量在<矢量Chart图表嵌入HTML5网络拓扑图的应用>一文中已经讲述了关于setCompType()方法的应用,今天我们用setImage()方法充分利用系统中定义好的矢量资源来实现文件上传进度条,我们先来看下效果图: 从效果图可以看到,向服务器上传了一个mp4文件,并在最下方显示

[iOS 多线程 &amp; 网络 - 2.5] - 小文件上传

A.文件上传 思路: 发送文件数据给服务器 使用post请求 必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type 请求体:文件数据 文件上传的格式要求十分严格,必须严格遵守 由于是一次性加载文件到内存上传,所以只能用于小文件上传 B.实现 1.设置POST请求 (1)使用POST请求方法 (2)设置请求头 设置内容长度.内容类型.分割线 (3)设置请求体 NSMutableData *body = [NSMutableData data]; 分割线

Web---文件上传-用apache的工具处理、打散目录、简单文件上传进度

我们需要先准备好2个apache的类: 上一个博客文章只讲了最简单的入门,现在来开始慢慢加深. 先过渡一下:只上传一个file项 index.jsp: <h2>用apache的工具处理文件上传</h2> <!-- 先过渡一下:只上传一个file项 --> <form action="<%= request.getContextPath() %>/upload" method="post" enctype=&quo