上传时如何在c#中重命名文件?

时间:2017-03-03 13:28:19

标签: c# angularjs asp.net-web-api asp.net-mvc-5

我正在开发web api和angularjs中的一个应用程序。我有文件上传部分。我能够上传文件,而不是在webroot中存储文件(我创建了名为Uploads的文件夹)。我的问题是我没有使用任何好的命名约定来维护文件的唯一性,因此有可能覆盖文件。我是angularjs的新手所以我在下面提到链接。 http://instinctcoder.com/angularjs-upload-multiple-files-to-asp-net-web-api/ 这是我的控制器级代码。

if (!Request.Content.IsMimeMultipartContent())
{
    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var uploadPath = HttpContext.Current.Server.MapPath("~/Uploads");
var multipartFormDataStreamProvider = new CustomUploadMultipartFormProvider(uploadPath);
await Request.Content.ReadAsMultipartAsync(multipartFormDataStreamProvider);
var fileName = "";
DateTime dt = DateTime.Now;
foreach (var key in multipartFormDataStreamProvider.Contents)
{
    var a = key.Headers;
    fileName = a.ContentDisposition.FileName;
    break;
}
foreach (var key in multipartFormDataStreamProvider.FormData.AllKeys)
{
    foreach (var val in multipartFormDataStreamProvider.FormData.GetValues(key))
    {
        Console.WriteLine(string.Format("{0}: {1}", key, val));
    }
}

在上面的代码中,我试图将日期部分添加到文件名的开头,如下所示

string filenameNew = "App1" + DateTime.Now.ToString("yyyyMMddHHmmss");
fileName = filenameNew + a.ContentDisposition.FileName; 

public CustomUploadMultipartFormProvider(string path) : base(path) { }
public override string GetLocalFileName(HttpContentHeaders headers)
{
    string startwith = "Nor" + DateTime.Now.ToString("yyyyMMddHHmmss");
    if (headers != null && headers.ContentDisposition != null)
    {
        return headers
            .ContentDisposition
            .FileName.TrimEnd('"').TrimStart('"').StartsWith("startwith").ToString();
    }
    return base.GetLocalFileName(headers);
}

这是我试过但不管原来的文件名是什么。我可以知道在保存时我可以将datepart附加到文件中吗?任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

我不确定你在GetLocalFileName内部尝试做什么,这很混乱。

首先,StartsWith返回一个布尔值(true或false),指示字符串是否以开头,无论你放在括号中。

string str = "SIMPLE";
bool t = str.StartsWith("SIM"); // true
bool f = str.StartsWith("ZIM"); // false

您将此bool转换回字符串并将字符串"startsWith"传递到方法中的事实意味着它将始终返回字符串"false" (bool值转换为字符串),除非真实文件名以"startsWith"开头。

我认为这是你正在寻找的东西:

public override string GetLocalFileName(HttpContentHeaders headers)
{
    string prefix = "Nor" + DateTime.Now.ToString("yyyyMMddHHmmss");
    if (headers != null && headers.ContentDisposition != null)
    {
        var filename = headers.ContentDisposition.FileName.Trim('"');
        return prefix + filename;
    }
    return base.GetLocalFileName(headers);
}

我的建议是学习C#和.Net的基础知识,或者阅读C#书或其他内容。

相关问题