这次在做项目时,要求把上传的文件全部要上传到阿里云的oss里去,但是在做的时候由于前端使用了bootrap的fileinput,而fileinput使用二进制方式上传,所以找不到上传的本地路径,这花了些时间来弄,不废话了,直接上代码:
前端跳过
后端代码:
using Aliyun.OSS;//没有这个,就去项目的nuget安装
public static string _id { get; } = Common.Tool.ReadAppSitting("AppID"); // <!-- OOS AppID -->
public static string _key { get; } = Common.Tool.ReadAppSitting("AppSercert"); // <!-- OOSAppSercert -->
public static string _host { get; } = Common.Tool.ReadAppSitting("Host"); <!-- OOS地址 -->
public static string _picUrl { get; } = Common.Tool.ReadAppSitting("PicUrl"); <!-- 图片二级域名-->
public static string _bucketName { get; } = Common.Tool.ReadAppSitting("bucketName"); <!-- OOS地址 bucketName-->
public ActionResult UPloadToOOS_new()
{
string FolderPath = "StuUpFiles/"+ DateTime.Now.ToString("yyyyMMdd") + "/";
var client = new OssClient(_host, _id, _key);//
List<Models.UpFileInfo> upFileInfoList = new List<Models.UpFileInfo>();
if (Request.Files.Count > 0)
{
for (int i = 0; i < Request.Files.Count; i++)
{
try
{
HttpPostedFileBase fb = Request.Files[i];
Models.UpFileInfo ufi = new Models.UpFileInfo();
string fileName = fb.FileName; //得到上传的文件名
ufi.OldFileName = fb.FileName; // 得到上传的文件名,并记录
ufi.FileSize = fb.ContentLength;//文件大小
ufi.SourceUrl = _picUrl + "/" + FolderPath;// savepath.Substring(1);//保存路径
ufi.FileType = fb.ContentType;//文件类型
string[] sp = fileName.ToLower().Split('.');
string filenamelast = sp[sp.Length - 1];//后缀名
fileName = Guid.NewGuid().ToString("N");//重新生成文件名
fileName += "." + filenamelast;
ufi.NewFileName = fileName;//新文件名称
string FilePath = FolderPath + fileName;//新文件名称
string contentType = MimeMapping.GetMimeMapping(FilePath);//得到文件类型
/*重点在这里*/
var metadata = new ObjectMetadata();
metadata.ContentLength = fb.ContentLength;
if (FilePath.Contains(".woff"))
{
metadata.ContentType = "font/x-font-woff";
}
else if (FilePath.Contains(".svg") || FilePath.Contains(".html") || FilePath.Contains(".xml"))
{
metadata.ContentType = "text/html";
}
else
{
metadata.ContentType = contentType;
}
/*因为使用了二进制上传,没有路径 不加这句话,在下面会报一个超出范围的错误*/
fb.InputStream.Seek(0, SeekOrigin.Begin);//不加这句话,在下面会报一个超出范围的错误
PutObjectResult por = client.PutObject(_bucketName, FilePath, fb.InputStream, metadata);
/*重点在这里 end*/
if (por.HttpStatusCode==System.Net.HttpStatusCode.OK)
{
upFileInfoList.Add(ufi);
}
}
catch (Exception ex)
{
//return Content(ex.Message);
continue;
}
}
}
return Content(upFileInfoList.ToJson());
}