首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Web Api 2 RESTFUL图像上传

Web Api 2 RESTFUL图像上传
EN

Stack Overflow用户
提问于 2014-01-23 06:37:28
回答 3查看 12.7K关注 0票数 7

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

我想存储公司的标志,客户面对foto等。

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

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

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

2)是否可以只设置.jpg、.png等支持的镜像,拒绝其他文件?

3)如何在upload方法中处理图片?像调整大小,减少文件大小,质量等?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-20 07:17:53

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

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

上面的所有工作都在Asp.Net,MVC,Web API1和2,自定义HTTP处理程序中工作,基本上在任何.Net代码中。

票数 1
EN

Stack Overflow用户

发布于 2014-01-24 20:07:06

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

2)如果您愚弄了该指南,您可以在循环中添加一个检查,以检查文件的结尾

代码语言:javascript
运行
复制
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

票数 5
EN

Stack Overflow用户

发布于 2014-04-20 07:26:22

@Binke从不在路径上使用字符串操作。例如,如果文件名类似于: some.file.txt,则fileName.split(‘.)1将不返回扩展名,如果文件没有扩展名,则将失败并出现索引超出范围的错误。请始终使用文件接口,即Path.GetExtension。

此外,使用扩展来获取内容类型是不安全的,特别是当涉及到图片和视频时,只要想想许多视频格式使用的avi扩展就知道了。

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21295513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档