现在的位置: 首页 > 综合 > 正文

测试在阿里云服务器上是否可以在指定文件后添加数据生成新文件

2016年08月11日 ⁄ 综合 ⁄ 共 5257字 ⁄ 字号 评论关闭

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("文件整体合并成功");
        }
    }
}

抱歉!评论已关闭.