2017-03-03 98 views
0

我正在開發web api和angularjs中的一個應用程序。我有文件上傳部分。我能夠上傳文件,我不存儲文件在webroot(我創建文件夾稱爲上傳)。我的問題是我沒有使用任何好的命名約定來保持文件的唯一性,所以有機會覆蓋文件。我是angularjs的新手,所以我引用下面的鏈接。 http://instinctcoder.com/angularjs-upload-multiple-files-to-asp-net-web-api/ 這是我的控制器級別代碼。如何在上傳時在c#中重命名文件?

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

我假設'CustomUploadMultipartFormProvider'寫入'ContentDisposition'頭文件中給出的文件名,而'filename'變量剛剛讀取這個值。也許不是你的問題的確切答案,但你可能只需要在文件上傳後重命名它。 – caesay

+0

是的,在這個請求發生的時候,這些文件已經被寫入了。請注意,在這段代碼中,您實際上是在執行任何文件寫入,因爲文件已經存在於'uploadPath'中。您需要簡單地執行文件系統重命名,或者使用不同的上傳技術爲您提供正在上傳的流。 – AaronLS

+0

謝謝。我更新了我的代碼。但那不起作用。 –

回答

0

我不確定你想要在GetLocalFileName裏面做什麼,這是相當混亂的。

首先,StartsWith返回一個布爾值(true或false),指示字符串是否以開頭,無論放在括號中。

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

你把這個bool的回字符串並傳遞字符串"startsWith"到方法的事實,意味着它會一直返回"false"(一個布爾值轉換成字符串值),除非真正的文件名以"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#的書什麼的。