using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Aliyun.OpenServices.OpenStorageService;
using System.IO;
using System.Collections;
namespace TestAddFile
{
class Program
{
static void ReadFile(string DownLoadPath, OssClient client,string bucketName,string key)
{
GetObjectRequest ReadRequest = new GetObjectRequest(bucketName, key);
FileStream s = new FileStream(DownLoadPath,FileMode.OpenOrCreate);
client.GetObject(ReadRequest,s);
}
static void Main(string[] args)
{
/////////////////////////////测试代码/////////////////////////////////////////////
string accessId = "NmBlLQLtoPjNy1fV";
string accessKey = "Ofp39rtQZPgzlxPGgtSE9MTWtPTXvW";
string strFullFilePath = "D:\\MyFile\\VBR.mp3";
string strAddFilePath = "D:\\MyFile\\不是你的错.mp3";
OssClient client = new OssClient(accessId, accessKey);
string bucketName = "haolipeng";
string key = "AddFileEndTest.mp4";
//测试在尾部添加数据后的文件是否可以增加成功
//string path = "D:\\haolipeng1.mp4";
//ReadFile(path, client, bucketName, key);
//Console.WriteLine("下载完成");
//分块上传请求 (初始化状态)
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, key);
InitiateMultipartUploadResult initResult = client.InitiateMultipartUpload(initRequest);
//设置每块5M
int partSize = 1024 * 512;
FileInfo partFile = new FileInfo(strFullFilePath);
// 获取分块数目
int partCount = (int)(partFile.Length / partSize);
bool bNoDivided = false;
if (partFile.Length % partSize != 0)
{
partCount++;
bNoDivided = true;
}
// 新建一个List保存每个分块上传后的ETag和PartNumber
List<PartETag> partETags = new List<PartETag>();
//分块上传
int i = 0;
for (i = 0; i < partCount; i++)
{
//当最后一块小于partSize时,不传数据
if (i == partCount - 1 && true == bNoDivided)
{
break;
}
// 获取文件流
FileStream fis = new FileStream(partFile.FullName, FileMode.Open);
//每块开始位置
long skipBytes = partSize * i;
fis.Position = skipBytes;
// fis.skip(skipBytes);
// 计算每个分块的大小
long size = partSize < partFile.Length - skipBytes ?
partSize : partFile.Length - skipBytes;
// 创建UploadPartRequest,上传分块
UploadPartRequest uploadPartRequest = new UploadPartRequest(bucketName, key, initResult.UploadId);
uploadPartRequest.InputStream = fis;
uploadPartRequest.PartSize = size;
uploadPartRequest.PartNumber = (i + 1);
UploadPartResult uploadPartResult = client.UploadPart(uploadPartRequest);
// 将返回的PartETag保存到List中
partETags.Add(uploadPartResult.PartETag);
//关闭文件
fis.Close();
}
Console.WriteLine("第一个文件上传成功");
////////////////////////////add//////////////////////////////////////////////
FileInfo addFile = new FileInfo(strAddFilePath);
int addCount = (int)(addFile.Length / partSize);
if (addFile.Length % partSize != 0)
{
addCount++;
}
List<PartETag> addETags = new List<PartETag>();
////////////////////////////add//////////////////////////////////////////////
////////////////////////////////add//////////////////////////////////////////
for (int j = 0; j < addCount; j++)
{
// 获取文件流
FileStream fis = new FileStream(addFile.FullName, FileMode.Open);
//每块开始位置
long skipBytes = partSize * j;
fis.Position = skipBytes;
// 计算每个分块的大小
long size = partSize < addFile.Length - skipBytes ?
partSize : addFile.Length - skipBytes;
// 创建UploadPartRequest,上传分块
UploadPartRequest uploadPartRequest = new UploadPartRequest(bucketName, key, initResult.UploadId);
uploadPartRequest.InputStream = fis;
uploadPartRequest.PartSize = size;
uploadPartRequest.PartNumber = (i + 1 + j);
UploadPartResult uploadPartResult = client.UploadPart(uploadPartRequest);
// 将返回的PartETag保存到List中
addETags.Add(uploadPartResult.PartETag);
//关闭文件
fis.Close();
}
Console.WriteLine("第二个文件上传成功");
////////////////////////////////add//////////////////////////////////////////
//分块上传(完成状态)
CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest(bucketName, key, initResult.UploadId);
foreach (PartETag partETag in partETags)
{
completeReq.PartETags.Add(partETag);
}
foreach (PartETag partETag in addETags)
{
completeReq.PartETags.Add(partETag);
}
//完成分块上传
CompleteMultipartUploadResult completeResult = client.CompleteMultipartUpload(completeReq);
// 返回最终文件的MD5,用于用户进行校验
// Console.WriteLine(completeResult.ETag);
Console.WriteLine("文件整体合并成功");
}
}
}