C#阿里云上传文件&返回下载路径

5 篇文章 0 订阅
4 篇文章 0 订阅
该代码示例展示了如何使用C#将多个URL对应的文件下载并压缩,然后上传到阿里云OSS服务。过程中涉及AccessKey管理、文件下载、Zip压缩、分片上传以及本地文件清理。最后返回阿里云存储的文件下载路径。
摘要由CSDN通过智能技术生成

C#阿里云上传文件返回下载路径

📒博客首页:蔚说的博客
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!
(C#学习笔记)仅供学习交流

C#阿里云上传文件返回下载路径-重难点

说明:

    /// <summary>
    /// 通过url获取发票批量下载
    /// 先传到阿里云oos再进行调浏览器下载
    /// 最后删除掉在服务器上的文件夹
    /// </summary>
    /// <param name="HttpUrlListStr">接收一个List</param>
    /// <returns></returns>

提示:

**
以下内容通过登录到阿里云的控制台获取
var endpoint = “XXX”;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
var accessKeyId = “XXX”;
var accessKeySecret = “XXX”;
**

实例:

public string downFileToZip(string HttpUrlListStr)
        {
            List<string> HttpUrlList = new List<string>(HttpUrlListStr.Split(','));
            var DownPicpath = System.Web.HttpContext.Current.Server.MapPath("/DownPicPackge");//获取IIS服务器临时文件目录   
            if (HttpUrlList == null || HttpUrlList.Count == 0)
            {
                return null;
            }
            try
            {
                var random = new Random();
                var zipMs = new MemoryStream();
                ZipOutputStream zipStream = new ZipOutputStream(zipMs);
                zipStream.SetLevel(9);//压缩率0~9
                foreach (var url in HttpUrlList)
                {
                    if (!string.IsNullOrWhiteSpace(url))
                    {
                        var urlStr = HttpUtility.UrlDecode(url);
                        Console.WriteLine(urlStr);
                        string fileExt = Path.GetExtension(urlStr).ToLower();
                        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(urlStr);
                        //return fileNameWithoutExtension;  ok
                        var strName = fileNameWithoutExtension.Substring(fileNameWithoutExtension.LastIndexOf("/") + 1) + random.Next(1000, 9999) + fileExt;
                        //return strName;   ok
                        zipStream.PutNextEntry(new ZipEntry(strName));

                        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlStr);
                        //string answer = Convert.ToString(request);
                        //return answer;
                        request.AllowAutoRedirect = true;
                        WebProxy proxy = new WebProxy();
                        proxy.BypassProxyOnLocal = true;
                        proxy.UseDefaultCredentials = true;
                        request.Proxy = proxy;

                        WebResponse response = request.GetResponse();
                        using (Stream streams = response.GetResponseStream())
                        {
                            Byte[] buffer = new Byte[1024];
                            int current = 0;
                            while ((current = streams.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                zipStream.Write(buffer, 0, current);
                            }
                            zipStream.Flush();
                        }
                    }
                }
                zipStream.Finish();
                zipMs.Position = 0;
                //return zipMs;
                //return "OK";
                //下边为打包压缩
                MemoryStream stream = zipMs;
                byte[] srcBuf = new Byte[stream.Length];
                stream.Read(srcBuf, 0, srcBuf.Length);
                stream.Seek(0, SeekOrigin.Begin);
                string filePath = "D:\\FileZip";
                //string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                if (!Directory.Exists(filePath))
                {
                    Directory.CreateDirectory(filePath);
                }
                //var date = GetTimeStamp(13).ToString();
                string date = DateTime.Now.ToString("yyyyMMddHHmmss");
                var file_name = "invoice" + date + ".zip";
                using (FileStream fs = new FileStream(filePath + "\\" + file_name, FileMode.Create, FileAccess.Write))
                //using (FileStream fs = new FileStream(file_name, FileMode.Create, FileAccess.Write))
                {
                    fs.Write(srcBuf, 0, srcBuf.Length);
                    fs.Close();
                    //return "下载成功";
                }

                var endpoint = "XXX";
                // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
                var accessKeyId = "XXX";
                var accessKeySecret = "XXX";
                // 填写Bucket名称。

                var bucketName = "inside-new";//指定自己的文件夹

                //return "下载成功";
                //return filePath+file_name;
                // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
                string dateTimeNow = DateTime.Now.ToString("yyyy-MM-dd");
                var objectName = "quandianFapiao/" + dateTimeNow + "/" + file_name;

                // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
                //写磁盘
                //创建文件夹
                //路径
                var localFilename = filePath + "\\" + file_name;//zip包在本地全路径
                                                                // 创建OssClient实例。
                var client = new OssClient(endpoint, accessKeyId, accessKeySecret);

                // 初始化分片上传,返回uploadId。
                var uploadId = "";

                try
                {
                    // 定义上传的文件及所属Bucket的名称。您可以在InitiateMultipartUploadRequest中设置ObjectMeta,但不必指定其中的ContentLength。
                    var request = new InitiateMultipartUploadRequest(bucketName, objectName);
                    var result = client.InitiateMultipartUpload(request);
                    uploadId = result.UploadId;

                    // 打印UploadId。
                    Console.WriteLine("Upload Id:{0}", result.UploadId);
                }
                catch (Exception ex)
                {
                    return ex.Message.ToString();
                }
                // 计算分片总数。

                var partSize = 100 * 1024;
                var fi = new FileInfo(localFilename);
                var fileSize = fi.Length;
                var partCount = fileSize / partSize;
                //文件后缀名
                var UpfierType = Path.GetExtension(fi.Name);
                if (fileSize % partSize != 0)
                {
                    partCount++;
                }
                // 开始分片上传。PartETags是保存PartETag的列表,OSS收到用户提交的分片列表后,会逐一验证每个分片数据的有效性。当所有的数据分片通过验证后,OSS会将这些分片组合成一个完整的文件。
                var partETags = new List<PartETag>();
                try
                {
                    using (var fs = System.IO.File.Open(localFilename, FileMode.Open))
                    {
                        for (var i = 0; i < partCount; i++)
                        {
                            var skipBytes = (long)partSize * i;
                            // 定位到本次上传的起始位置。
                            fs.Seek(skipBytes, 0);
                            // 计算本次上传的分片大小,最后一片为剩余的数据大小。
                            var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
                            var request = new UploadPartRequest(bucketName, objectName, uploadId)
                            {
                                InputStream = fs,
                                PartSize = size,
                                PartNumber = i + 1
                            };
                            // 调用UploadPart接口执行上传功能,返回结果中包含了这个数据片的ETag值。
                            var result = client.UploadPart(request);
                            partETags.Add(result.PartETag);
                            Console.WriteLine("finish {0}/{1}", partETags.Count, partCount);
                        }
                    }
                }
                catch (Exception ex)
                {
                    return ex.Message.ToString();
                }
                try
                {
                    var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId);
                    foreach (var partETag in partETags)
                    {
                        completeMultipartUploadRequest.PartETags.Add(partETag);
                    }
                    client.CompleteMultipartUpload(completeMultipartUploadRequest);
                }
                catch (Exception ex)
                {

                    return ex.Message.ToString();
                }
                // 完成分片上传。
                //string sPath = Server.MapPath(localFilename);                                                        //删除文件夹
                DirectoryInfo dir = new DirectoryInfo(filePath);
                if (dir.Exists)
                {
                    DirectoryInfo[] childs = dir.GetDirectories();
                    foreach (DirectoryInfo child in childs)
                    {
                        child.Delete(true);
                    }
                    dir.Delete(true);
                }
                return "xxx/" + objectName;
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值