我試圖上傳一個文件異步到我的web服務器(ASP.NET MVC)。具體到我的web api端點。我跟着幾個教程,但我不斷收到空參數的錯誤。錯誤與ReadAsMultipartAsync和MultiPartFormDataStreamProvider
它發生在我的子類MultipartFormDataStreamProvider
。方法GetLocalFileName
,被正確調用第一個正確的HttpContentHeaders
,但隨後被null
標頭第二次調用。
該文件成功地保存了我設置的文件名,但是當我收到一個異常時,我無法知道生成的名稱是什麼。
但是,如果我只使用基類MultipartFormDataStreamProvider
類,該文件完美保存,沒有錯誤,但在這種情況下我無法控制文件名。
這是API方法:
[HttpPost]
public async Task<FilesUploadResult> Save()
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
var ret = new FilesUploadResult(HttpStatusCode.UnsupportedMediaType, null);
ret.Message = "Unsupported Media Type. Request must contain multipart/form-data form.";
return ret;
}
var path = UploadsFolderPath;
// to-do: this works but for some reason makes a call with empty headers.
var provider = new SimpleMultipartFormDataStreamProvider(path);
// this provider saves the file with an arbritrary name
//var provider = new MultipartFormDataStreamProvider(path);
try
{
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider as MultipartFormDataStreamProvider);
var files = from f in provider.FileData
let info = new FileInfo(f.LocalFileName)
select new FileUploadDescription(info.Name, path + "\\" + info.Name, info.Length, HttpStatusCode.Created);
var ret = new FilesUploadResult(HttpStatusCode.OK, files);
return ret;
}
catch (Exception ex)
{
var ret = new FilesUploadResult(HttpStatusCode.InternalServerError, null);
ret.Message = ex.Message;
return ret;
}
}
這是我SimpleMultipartFormDataStreamProvider
代碼:
public class SimpleMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public SimpleMultipartFormDataStreamProvider(string path) : base(path) { }
public override string GetLocalFileName(HttpContentHeaders headers)
{
// make sure the headers are valid
if (headers == null)
{
throw new ArgumentNullException("headers");
}
// filename
var filename = CleanString(headers.ContentDisposition.FileName); ;
// create the local file name
var localFileName = string.Format("_{0}_{1}", GetRandomName(), filename);
//this is here because Chrome submits files in quotation marks which get treated as part of the filename and get escaped
return localFileName.Replace("\"", string.Empty);
}
private string GetRandomName()
{
return GuidHelper.ShortUniqueId(16);
}
private static string CleanString(string str)
{
if (string.IsNullOrWhiteSpace(str))
return string.Empty;
var sb = new StringBuilder();
foreach (char c in str)
{
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '.' || c == '_')
{
sb.Append(c);
}
}
return sb.ToString();
}
}
誰能告訴我爲什麼我收到了GetLocalFileName
叫兩次,第二次空頭?
這是我的問題。讓我把頭髮拉出一個下午。非常感謝! – CountZero