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();
}
}