File upload 使用guid和文件扩展名上载ASP.NET WebApi文件

File upload 使用guid和文件扩展名上载ASP.NET WebApi文件,file-upload,asp.net-web-api,File Upload,Asp.net Web Api,我目前能够保存上载到WebAPI控制器的文件,但我希望能够将该文件保存为具有正确文件扩展名的guid,以便正确查看 代码: 我似乎无法掌握内容的实际文件名。我想headers.ContentDisposition.FileName可能是一个候选文件,但似乎没有得到填充。感谢上面的评论,它为我指明了正确的方向 为了澄清最终的解决方案,我使用了一个MultipartFormDataStreamProvider,它可以自动流式处理文件。代码在我发布到另一个问题的另一个问题中: 下面列出了我的完整提供

我目前能够保存上载到WebAPI控制器的文件,但我希望能够将该文件保存为具有正确文件扩展名的guid,以便正确查看

代码:


我似乎无法掌握内容的实际文件名。我想headers.ContentDisposition.FileName可能是一个候选文件,但似乎没有得到填充。

感谢上面的评论,它为我指明了正确的方向

为了澄清最终的解决方案,我使用了一个MultipartFormDataStreamProvider,它可以自动流式处理文件。代码在我发布到另一个问题的另一个问题中:

下面列出了我的完整提供商代码。生成guid文件名的关键是重写GetLocalFileName函数并使用headers.ContentDisposition属性。提供者处理将内容流式传输到文件的过程

public class MyFormDataStreamProvider : MultipartFormDataStreamProvider
{
    public MyFormDataStreamProvider (string path)
        : base(path)
    { }

    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
    {
        // restrict what images can be selected
        var extensions = new[] { "png", "gif", "jpg" };
        var filename = headers.ContentDisposition.FileName.Replace("\"", string.Empty);

        if (filename.IndexOf('.') < 0)
            return Stream.Null;

        var extension = filename.Split('.').Last();

        return extensions.Any(i => i.Equals(extension, StringComparison.InvariantCultureIgnoreCase))
                   ? base.GetStream(parent, headers)
                   : Stream.Null;

    }

    public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
    {
        // override the filename which is stored by the provider (by default is bodypart_x)
        string oldfileName = headers.ContentDisposition.FileName.Replace("\"", string.Empty);
        string newFileName = Guid.NewGuid().ToString() + Path.GetExtension(oldfileName);

        return newFileName;       
    }
}
公共类MyFormDataStreamProvider:MultipartFormDataStreamProvider
{
公共MyFormDataStreamProvider(字符串路径)
:基本(路径)
{ }
公共重写流GetStream(HttpContent父级、HttpContentHeaders头)
{
//限制可以选择的图像
var extensions=new[]{“png”、“gif”、“jpg”};
var filename=headers.ContentDisposition.filename.Replace(“\”,string.Empty);
if(filename.IndexOf('.')<0)
返回Stream.Null;
var extension=filename.Split('.').Last();
返回extensions.Any(i=>i.Equals(extension,StringComparison.InvariantCultureIgnoreCase))
?base.GetStream(父级、标题)
:Stream.Null;
}
公共重写字符串GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders)
{
//覆盖提供程序存储的文件名(默认为bodypart_x)
string oldfileName=headers.ContentDisposition.FileName.Replace(“\”,string.Empty);
字符串newFileName=Guid.NewGuid().ToString()+Path.GetExtension(oldfileName);
返回newFileName;
}
}

这里有一个类似的问题,答案是[[1]:你能分享一下你的请求的标题是什么样子的吗?你在请求中填充了ContentDisposition标题吗?设置这样的标题是客户端的责任。你的客户端是什么样子的?@Kiran:不,它没有填充。而且,所有的示例似乎都使用流提供程序来加载流。我想在不填充的情况下阅读它使用提供程序并使用guid和扩展名保存文件。不使用流提供程序的原因是它似乎不允许我返回为文件创建的guid的调用函数。在
var filename=headers.ContentDisposition.filename.Replace(“\”,string.Empty)处引发空引用异常;
。在执行
Replace()
之前,通过检查
filename
是否不为null来修复。为什么要重写GetStream方法?
public class MyFormDataStreamProvider : MultipartFormDataStreamProvider
{
    public MyFormDataStreamProvider (string path)
        : base(path)
    { }

    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
    {
        // restrict what images can be selected
        var extensions = new[] { "png", "gif", "jpg" };
        var filename = headers.ContentDisposition.FileName.Replace("\"", string.Empty);

        if (filename.IndexOf('.') < 0)
            return Stream.Null;

        var extension = filename.Split('.').Last();

        return extensions.Any(i => i.Equals(extension, StringComparison.InvariantCultureIgnoreCase))
                   ? base.GetStream(parent, headers)
                   : Stream.Null;

    }

    public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
    {
        // override the filename which is stored by the provider (by default is bodypart_x)
        string oldfileName = headers.ContentDisposition.FileName.Replace("\"", string.Empty);
        string newFileName = Guid.NewGuid().ToString() + Path.GetExtension(oldfileName);

        return newFileName;       
    }
}