使用mvc4在.net服务器上保存文件时更改名称

本文关键字:保存文件 mvc4 net 服务器 使用 | 更新日期: 2023-09-27 17:57:56

我想使用android设备将图像上传到我的服务器,我在谷歌上搜索了它,并找到了一个代码这里低于

public async Task<HttpResponseMessage> PostFile()
{
    // Check if the request contains multipart/form-data.
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }
    //string root = HttpContext.Current.Server.MapPath("~/App_Data");
    string root = HttpContext.Current.Server.MapPath("~/Files");
    var provider = new MultipartFormDataStreamProvider(root);
    try
    {
        StringBuilder sb = new StringBuilder(); // Holds the response body
        // Read the form data and return an async task.
        await Request.Content.ReadAsMultipartAsync(provider);
        // This illustrates how to get the form data.
        foreach (var key in provider.FormData.AllKeys)
        {
           // Trace.WriteLine(key.Headers.ContentDisposition.FileName);
            foreach (var val in provider.FormData.GetValues(key))
            {
                sb.Append(string.Format("{0}: {1}'n", key, val));
            }
        }
        // This illustrates how to get the file names for uploaded files.
        foreach (var file in provider.FileData)
        {
            FileInfo fileInfo = new FileInfo(file.LocalFileName);
            sb.Append(string.Format("Uploaded file: {0} ({1} bytes)'n", fileInfo.Name, fileInfo.Length));
        }
        return new HttpResponseMessage()
        {
            Content = new StringContent(sb.ToString())
        };
    }
    catch(System.Exception e)
    {
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
    }
}

这个代码工作得很好,当我从android手机发送文件时,它会将其保存在我的服务器指定的文件夹中,但现在的问题是,当我试图从另一部手机访问它时,它显示的内容不是,为什么??找不到内容是因为当这段代码将文件保存在我的服务器上时,它会更改其原始名称,并将其替换为类似的名称

BodyPart_2ce1d675-31f6-41ec-8cdd-595fea6af0e3

并从中删除它的扩展名,这样它就不可访问了,但如果我在服务器上重命名这个文件,并将扩展名添加到它的可访问范围之外,我的观点是,有没有任何方法可以使用这个代码在服务器上存储一个扩展名为+的文件,并进行一些小的修改。

提前感谢您的帮助。

使用mvc4在.net服务器上保存文件时更改名称

您可以扩展MultipartFormDataStreamProvider类,以便定义自己的文件命名逻辑,如下所示:

using System.Net.Http;
using System.Net.Http.Headers;
...
public class CustomMultipartFormDataStreamProvider 
    : MultipartFormDataStreamProvider
{
    public CustomMultipartFormDataStreamProvider(string path) 
        : base(path)
    {
    }
    public override string GetLocalFileName(HttpContentHeaders headers)
    {
        return headers.ContentDisposition.FileName.Replace("'"", string.Empty);
    }
}

现在替换CustomMultipartFormDataStreamProvider的出现,使

var provider = new MultipartFormDataStreamProvider(root);

成为

var provider = new CustomMultipartFormDataStreamProvider (root);