最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
WebApi2 文件中图片的上传与下载
时间:2017-06-01 编辑:简简单单 来源:一聚教程网
Asp.Net Framework webapi2 文件上传与下载 前端界面采用Ajax的方式执行
一、项目结构
1.App_Start配置了跨域访问,以免请求时候因跨域问题不能提交。具体的跨域配置方式如下,了解的朋友请自行略过。
跨域配置:NewGet安装dll Microsofg.AspNet.Cors
然后在App_Start 文件夹下的WebApiConfig.cs中写入跨域配置代码。
代码如下 | 复制代码 |
publicstaticclassWebApiConfig { publicstaticvoidRegister(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); // Web API configuration and services //跨域配置 //need reference from nuget config.EnableCors(newEnableCorsAttribute("*","*","*")); config.Routes.MapHttpRoute( name:"DefaultApi", routeTemplate:"api/{controller}/{id}", defaults:new{ id = RouteParameter.Optional } ); //if config the global filter input there need not write the attributes //config.Filters.Add(new App.WebApi.Filters.ExceptionAttribute_DG()); } } |
跨域就算完成了,请自行测试。
2.新建两个控制器,一个PicturesController.cs,一个FilesController.cs当然图片也是文件,这里图片和文件以不同的方式处理的,因为图片的方式文件上传没有成功,所以另寻他路,如果在座的有更好的方式,请不吝赐教!
二、项目代码
1.我们先说图片上传、下载控制器接口,这里其实没什么好说的,就一个Get获取文件,参数是文件全名;Post上传文件;直接上代码。
代码如下 | 复制代码 |
usingQX_Frame.App.WebApi; usingQX_Frame.FilesCenter.Helper; usingQX_Frame.Helper_DG; usingQX_Frame.Helper_DG.Extends; usingSystem; usingSystem.Collections.Generic; usingSystem.Diagnostics; usingSystem.IO; usingSystem.Linq; usingSystem.Net; usingSystem.Net.Http; usingSystem.Net.Http.Headers; usingSystem.Text; usingSystem.Threading.Tasks; usingSystem.Web.Http; /** * author:qixiao * create:2017-5-26 16:54:46 * */ namespaceQX_Frame.FilesCenter.Controllers { publicclassPicturesController : WebApiControllerBase { //Get : api/Pictures publicHttpResponseMessage Get(stringfileName) { HttpResponseMessage result =null; DirectoryInfo directoryInfo =newDirectoryInfo(IO_Helper_DG.RootPath_MVC +@"Files/Pictures"); FileInfo foundFileInfo = directoryInfo.GetFiles().Where(x => x.Name == fileName).FirstOrDefault(); if(foundFileInfo !=null) { FileStream fs =newFileStream(foundFileInfo.FullName, FileMode.Open); result =newHttpResponseMessage(HttpStatusCode.OK); result.Content =newStreamContent(fs); result.Content.Headers.ContentType =newSystem.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition =newContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = foundFileInfo.Name; } else { result =newHttpResponseMessage(HttpStatusCode.NotFound); } returnresult; } //POST : api/Pictures publicasync TaskPost() { if(!Request.Content.IsMimeMultipartContent()) { thrownewException_DG("unsupported media type", 2005); } stringroot = IO_Helper_DG.RootPath_MVC; IO_Helper_DG.CreateDirectoryIfNotExist(root +"/temp"); var provider =newMultipartFormDataStreamProvider(root +"/temp"); // Read the form data. await Request.Content.ReadAsMultipartAsync(provider); ListfileNameList =newList(); StringBuilder sb =newStringBuilder(); longfileTotalSize = 0; intfileIndex = 1; // This illustrates how to get the file names. foreach(MultipartFileData fileinprovider.FileData) { //new folder stringnewRoot = root +@"Files/Pictures"; IO_Helper_DG.CreateDirectoryIfNotExist(newRoot); if(File.Exists(file.LocalFileName)) { //new fileName stringfileName = file.Headers.ContentDisposition.FileName.Substring(1, file.Headers.ContentDisposition.FileName.Length - 2); stringnewFileName = Guid.NewGuid() +"."+ fileName.Split('.')[1]; stringnewFullFileName = newRoot +"/"+ newFileName; fileNameList.Add($"Files/Pictures/{newFileName}"); FileInfo fileInfo =newFileInfo(file.LocalFileName); fileTotalSize += fileInfo.Length; sb.Append($" #{fileIndex} Uploaded file: {newFileName} ({ fileInfo.Length} bytes)"); fileIndex++; File.Move(file.LocalFileName, newFullFileName); Trace.WriteLine("1 file copied , filePath="+ newFullFileName); } } returnJson(Return_Helper.Success_Msg_Data_DCount_HttpCode($"{fileNameList.Count} file(s) /{fileTotalSize} bytes uploaded successfully! Details -> {sb.ToString()}", fileNameList, fileNameList.Count)); } } } |
里面可能有部分代码在Helper帮助类里面写的,其实也仅仅是获取服务器根路径和如果判断文件夹不存在则创建目录,这两个代码的实现如下:
代码如下 | 复制代码 |
publicstaticstringRootPath_MVC { get{returnSystem.Web.HttpContext.Current.Server.MapPath("~"); } } //create Directory publicstaticboolCreateDirectoryIfNotExist(stringfilePath) { if(!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } returntrue; } |
2.文件上传下载接口和图片大同小异。
代码如下 | 复制代码 |
usingQX_Frame.App.WebApi; usingQX_Frame.FilesCenter.Helper; usingQX_Frame.Helper_DG; usingSystem.Collections.Generic; usingSystem.Diagnostics; usingSystem.IO; usingSystem.Linq; usingSystem.Net; usingSystem.Net.Http; usingSystem.Net.Http.Headers; usingSystem.Text; usingSystem.Threading.Tasks; usingSystem.Web; usingSystem.Web.Http; /** * author:qixiao * create:2017-5-26 16:54:46 * */ namespaceQX_Frame.FilesCenter.Controllers { publicclassFilesController : WebApiControllerBase { //Get : api/Files publicHttpResponseMessage Get(stringfileName) { HttpResponseMessage result =null; DirectoryInfo directoryInfo =newDirectoryInfo(IO_Helper_DG.RootPath_MVC +@"Files/Files"); FileInfo foundFileInfo = directoryInfo.GetFiles().Where(x => x.Name == fileName).FirstOrDefault(); if(foundFileInfo !=null) { FileStream fs =newFileStream(foundFileInfo.FullName, FileMode.Open); result =newHttpResponseMessage(HttpStatusCode.OK); result.Content =newStreamContent(fs); result.Content.Headers.ContentType =newSystem.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition =newContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = foundFileInfo.Name; } else { result =newHttpResponseMessage(HttpStatusCode.NotFound); } returnresult; } //POST : api/Files publicasync TaskPost() { //get server root physical path stringroot = IO_Helper_DG.RootPath_MVC; //new folder stringnewRoot = root +@"Files/Files/"; //check path is exist if not create it IO_Helper_DG.CreateDirectoryIfNotExist(newRoot); ListfileNameList =newList(); StringBuilder sb =newStringBuilder(); longfileTotalSize = 0; intfileIndex = 1; //get files from request HttpFileCollection files = HttpContext.Current.Request.Files; await Task.Run(() => { foreach(var finfiles.AllKeys) { HttpPostedFile file = files[f]; if(!string.IsNullOrEmpty(file.FileName)) { stringfileLocalFullName = newRoot + file.FileName; file.SaveAs(fileLocalFullName); fileNameList.Add($"Files/Files/{file.FileName}"); FileInfo fileInfo =newFileInfo(fileLocalFullName); fileTotalSize += fileInfo.Length; sb.Append($" #{fileIndex} Uploaded file: {file.FileName} ({ fileInfo.Length} bytes)"); fileIndex++; Trace.WriteLine("1 file copied , filePath="+ fileLocalFullName); } } }); returnJson(Return_Helper.Success_Msg_Data_DCount_HttpCode($"{fileNameList.Count} file(s) /{fileTotalSize} bytes uploaded successfully! Details -> {sb.ToString()}", fileNameList, fileNameList.Count)); } } } |
实现了上述两个控制器代码以后,我们需要前端代码来调试对接,代码如下所示。
代码如下 | 复制代码 |
$(document).ready(function () { var appDomain ="http://localhost:3997/"; $("#btn_fileUpload").click(function () { /** * 用ajax方式上传文件 ----------- * */ //-------asp.net webapi fileUpload // var formData =newFormData($("#uploadForm")[0]); $.ajax({ url: appDomain +'api/Files', type:'POST', data: formData, async:false, cache:false, contentType:false, processData:false, success: function (data) { console.log(JSON.stringify(data)); }, error: function (data) { console.log(JSON.stringify(data)); } }); //----end asp.net webapi fileUpload //----.net core webapi fileUpload // var fileUpload = $("#files").get(0); // var files = fileUpload.files; // var data = new FormData(); // for (var i = 0; i < files.length; i++) { // data.append(files[i].name, files[i]); // } // $.ajax({ // type: "POST", // url: appDomain+'api/Files', // contentType: false, // processData: false, // data: data, // success: function (data) { // console.log(JSON.stringify(data)); // }, // error: function () { // console.log(JSON.stringify(data)); // } // }); //--------end net core webapi fileUpload /** * ajaxfileupload.js 方式上传文件 * */ // $.ajaxFileUpload({ // type: 'post', // url: appDomain + 'api/Files', // secureuri: false, // fileElementId: 'files', // success: function (data) { // console.log(JSON.stringify(data)); // }, // error: function () { // console.log(JSON.stringify(data)); // } // }); }); //end click })
article-form
|
至此,我们的功能已全部实现,下面我们来测试一下:
可见,文件上传成功,按预期格式返回!
下面我们测试单图片上传->
然后我们按返回的地址进行访问图片地址。
发现并无任何压力!
下面测试多图片上传->
完美~
至此,我们已经实现了WebApi2文件和图片上传,下载的全部功能。
这里需要注意一下Web.config的配置上传文件支持的总大小,我这里配置的是最大支持的文件大小为1MB
代码如下 | 复制代码 |
|
以上所述是小编给大家介绍的WebApi2 文件中图片的上传与下载,希望对大家有所帮助。在此也非常感谢大家对本网站的支持
-
上一个: 利用asp.net实现群发邮件功能
相关文章
- Tornado文件图片上传例子 07-31
- C#复制数组的两种方式及效率比较解读 10-24
- ASP.NET Identity用法解析 10-24
- ASP.NET MVC使用Identity增删改查用户介绍 10-24
- C语言中atoi函数模拟实现介绍 10-18
- .Net反向代理组件Yarp用法介绍 10-10