允许在URI中为Web API调用提供完整的文件路径

本文关键字:路径 文件 调用 URI 中为 API Web | 更新日期: 2023-09-27 18:07:17

我目前正在使用Web API 2实现'下载文件'。

但是,由于可以下载的文件不存储在数据库中,所以我传入完整的文件路径作为标识参数。

这种方法的问题似乎是filePath包含对URI无效的字符…有人有任何建议来解决这个问题或替代方法吗?

下载文件方法:

    [HttpGet]
    [Route("Files/{*filePath}")]
    public HttpResponseMessage Get([FromUri]string filePath)
    {
        try
        {
            var file = new FileInfo(filePath);
            byte[] bytes = System.IO.File.ReadAllBytes(filePath);
            var result = Request.CreateResponse(HttpStatusCode.OK);
            result.Content = new ByteArrayContent(bytes);
            result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = file.Name + file.Extension;
            return result;
        }
        catch(Exception ex)
        {
            return Request.CreateResponse(HttpStatusCode.InternalServerError, ex);
        }
    }

允许在URI中为Web API调用提供完整的文件路径

要求客户端在URI中放置完整路径(即使它被编码为只包含URI的有效字符)意味着您可能在某处发布这些路径…这不是一个好主意,原因如下:

  1. 安全性-完整路径披露和相关的相对路径遍历
    1. 。什么是阻止某人在路径传递到一个敏感的文件(例如您的web。配置文件),并可能获得有助于攻击您的系统的信息?
  2. 可维护性
    1. 客户端可能维护URI的副本以供重用或分发-如果文件路径改变会发生什么?这里有一些与此主题相关的对话:很酷的uri不会改变

我的建议-你不必把文件本身放在数据库中,但把文件列表放在数据库中,并在URL中使用唯一标识符(例如,可能是一个slug或GUID)。在数据库中查找标识符以发现路径,然后返回该文件。

这确保:

  1. 没有人可以读取你没有索引和确定是安全下载的文件
  2. 如果你移动文件,你可以更新数据库和客户端uri不会改变
  3. 为了回答你最初的问题,你可以很容易地确保唯一标识符仅由URI安全字符
  4. 组成

一旦有了数据库,随着时间的推移,您可能还会发现维护数据库中的其他元数据非常有用,例如谁上传了文件,何时,谁下载了文件,以及何时,等等。