一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

    }

  }

}

 

实现了上述两个控制器代码以后,我们需要前端代码来调试对接,代码如下所示。

 

 代码如下复制代码

  

  

  

  

  

    

      

article-form

    

    

      

        file-multiple属性可以选择多项

        

      

    

  

 

至此,我们的功能已全部实现,下面我们来测试一下:

可见,文件上传成功,按预期格式返回!

下面我们测试单图片上传->

然后我们按返回的地址进行访问图片地址。

发现并无任何压力!

下面测试多图片上传->

完美~

 至此,我们已经实现了WebApi2文件和图片上传,下载的全部功能。

 这里需要注意一下Web.config的配置上传文件支持的总大小,我这里配置的是最大支持的文件大小为1MB

 

 代码如下复制代码

  

  

   

    

    

    

    

   

   

   

    

    

  

  

以上所述是小编给大家介绍的WebApi2 文件中图片的上传与下载,希望对大家有所帮助。在此也非常感谢大家对本网站的支持

热门栏目