我正在尝试使用 ASP.NET WebApi2 上传文件。我正在尝试两个选项:第一个是将文件保存在内存中。为此,我使用了一段代码,它是 HttpContent 类的扩展:
public static async Task<HttpPostedData> ParseMultipartAsync(this HttpContent postedContent)
{
var provider = await postedContent.ReadAsMultipartAsync();
var files = new Dictionary<string, HttpPostedFile>(StringComparer.InvariantCultureIgnoreCase);
var fields = new Dictionary<string, HttpPostedField>(StringComparer.InvariantCultureIgnoreCase);
string[] toegestaneExtensies = { ".jpg", ".jpeg", ".gif", ".png", ".pdf", ".txt", ".xlsx" };
foreach (var content in provider.Contents)
{
var fieldName = content.Headers.ContentDisposition.Name.Trim('"');
if (!string.IsNullOrEmpty(content.Headers.ContentDisposition.FileName))
{
bool geuploadBestandHeeftToegestaneExtensie = (toegestaneExtensies.Contains(Path.GetExtension(content.Headers.ContentDisposition.FileName)));
if ((content.Headers.ContentLength > 0) && geuploadBestandHeeftToegestaneExtensie)
{
var file = await content.ReadAsByteArrayAsync();
var fileName = content.Headers.ContentDisposition.FileName.Trim('"');
files.Add(fieldName, new HttpPostedFile(fieldName, fileName, file));
}
}
else
{
if (fieldName != "submit")
{
var data = await content.ReadAsStringAsync();
fields.Add(fieldName, new HttpPostedField(fieldName, data));
}
}
}
return new HttpPostedData(fields, files);
}
}
Run Code Online (Sandbox Code Playgroud)
但这会引发异常,因为 FileName 的格式不正确。我可以看到图片中的文件名是“正常的”,但是查看 ContentDisposition,文件名突然变成了“\”banana.jpg\””。为什么是这样?
我要做的第二件事是保存到磁盘。这似乎有效,我可以将文件写入磁盘,但收到以下错误消息:
“将 MIME 多部分正文部分写入输出流时出错”-“拒绝访问”。
它只是以下代码:
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public CustomMultipartFormDataStreamProvider(string path) : base(path)
{
}
public override string GetLocalFileName(HttpContentHeaders headers)
{
return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
}
}
var streamProvider = new MultipartFormDataStreamProvider("d:/");
var t = await Request.Content.ReadAsMultipartAsync(streamProvider);
Run Code Online (Sandbox Code Playgroud)
但是没有访问被拒绝,文件被写入,以前不存在,文件有一个正常的文件名。会发生什么?
nat*_*hfy 10
错误在这里:https : //github.com/aspnet/HttpAbstractions/issues/446
解决方法是:
var fileName = file.Headers.ContentDisposition.FileName.TrimStart('\"').TrimEnd('\"');
悲伤但真实
甚至比 nathfy 的解决方案更干净:
var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2317 次 |
| 最近记录: |