【问题标题】:Web Api 2 RESTFUL Image UploadWeb Api 2 RESTFUL 图片上传
【发布时间】:2015-06-26 06:13:30
【问题描述】:

我是 Web Api 的新手,我正在做我的第一个项目。我正在为我们公司开发移动 CRM 系统。

我想存储公司标志、客户面部照片等。

我找到了一些关于这个主题的教程,但不幸的是其中一些是旧的(不使用异步),而其他的则不起作用。

最后我找到了这个: http://www.intstrings.com/ramivemula/articles/file-upload-using-multipartformdatastreamprovider-in-asp-net-webapi/ 它工作正常,但我不明白一些事情。

1) 我应该使用 App_Data(或任何其他文件夹,如 /Uploads)来存储这些图像,还是将图像存储在数据库中?

2) 我可以只设置 .jpg、.png 等支持的图像并拒绝任何其他文件吗?

3) 上传方式如何处理图片?比如调整大小、减小文件大小、质量等?

谢谢

【问题讨论】:

    标签: c# asp.net .net rest asp.net-web-api


    【解决方案1】:

    1) 我们将文件存储在与 app_data 不同的位置。我们有几个客户组,我们为他们提供了一个从数据库中获取的唯一文件夹。存储在数据库中也是一种选择,但如果您走这条路,请确保您保存的文件不直接属于您需要经常检索的表。没有对错之分,但请阅读this question and answer 了解一些优点和缺点。

    2) 如果你把那个指南弄糊涂了,你可以在循环中放一个检查来检查文件结尾

    List<string> denyList = new List<string>();
    denyList.Add(".jpg");
    
    foreach (MultipartFileData file in provider.FileData) 
    {
        string fileName = Path.GetFileName(file.LocalFileName);
        if(denyList.Contains(Path.GetExtension(fileName))
             throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    
        files.Add(Path.GetFileName(file.LocalFileName)); 
    }
    

    3) 调整图像大小是我自己从未亲自做过的事情,但我认为您应该看看 System.Drawing.Graphics 命名空间。 找到了一个可以接受的图片缩小答案的链接:ASP.Net MVC Image Upload Resizing by downscaling or padding

    【讨论】:

    • 您好,感谢您的回复。您回答了我的大部分问题 :) 不幸的是,还有一个关于您发布的代码的问题。您在 foreach 中使用提供程序。但是当您从提供者加载数据时,该文件已经保存在服务器上。因此,如果它是不受支持的格式,您会发回错误,但文件仍存储在服务器上。
    • 你好山达克。只需从您链接的站点读取代码,它看起来像文件。添加是保存文件的部分,但建议在保存文件之前抛出错误,正如您所提到的。您可能需要在创建数据并将数据读取到提供程序之前检查 Request.Content 以避免保存文件。
    【解决方案2】:

    这些问题实际上都与 Web API 或 REST 无关。

    1. 如果您使用的是 SQL Server 2008 或更新版本,答案是使用 FILESTREAM 列。这看起来像数据库中的一列,具有所有优点(即备份、复制、事务),但数据实际上存储在文件系统中。因此,您可以充分利用每个世界,即不会发生有人意外删除文件,因此数据库将引用不存在的文件,反之亦然,数据库中的记录被删除,但文件不会,因此您最终会得到一堆孤儿文件。使用数据库有很多优点,即元数据可以与文件相关联并且权限更容易设置。
    2. 这取决于文件的上传方式。 IE。如果使用多部分表单,则在保存部分之前检查每个部分的内容类型。您甚至可以创建自己的 MultipartStreamProvider 类。作为一个 API,upload 方法可能有一个流或字节数组参数和一个内容类型参数,在这种情况下,只需在保存内容之前测试内容类型参数的值。对于其他上传方法,根据输入内容执行类似操作。
    3. 您可以使用 .Net 的内置类(即 Bitmap:SetResolution、RotateFlip,使用接受大小的构造函数来调整大小),或者如果您不熟悉图像处理,请选择图像处理库。

    以上所有内容都适用于 Asp.Net、MVC、Web API 1 和 2、自定义 HTTP 处理程序,基本上适用于任何 .Net 代码。

    【讨论】:

      【解决方案3】:

      @宾克 永远不要对路径进行用户字符串操作。 IE。如果文件名如下:fileName.split('.')[1] 将不会返回扩展名:some.file.txt,如果文件没有扩展名,则会因索引超出范围错误而失败。 始终使用文件 API,即 Path.GetExtension。

      同样使用扩展获取内容类型也不安全,尤其是涉及图片和视频的时候,想想很多视频格式都使用的 avi 扩展。

      files.Add(Path.GetFileName(file.LocalFileName)) 应该是 files.Add(fileName)。

      【讨论】:

      • @noelicus 可能您忘记了新用户在获得一定声誉之前不允许发表评论,他们唯一的选择就是回答。
      • 您可能忘记了当您意识到答案不相关时可以删除它们。 :-D
      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 2015-05-13
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多