C# 在ASP.NET中重命名并发上载的文件
我使用以下代码接收上传的文件并将其存储在服务器上的uploadedFiles文件夹中C# 在ASP.NET中重命名并发上载的文件,c#,asp.net,asp.net-mvc,file-upload,multipartform-data,C#,Asp.net,Asp.net Mvc,File Upload,Multipartform Data,我使用以下代码接收上传的文件并将其存储在服务器上的uploadedFiles文件夹中 public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider { public CustomMultipartFormDataStreamProvider(string path) : base(path) { } public override string GetLocalFileN
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public CustomMultipartFormDataStreamProvider(string path) : base(path) { }
public override string GetLocalFileName(HttpContentHeaders headers)
{
return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
}
}
[HttpPost]
public async Task<HttpResponseMessage> ReceiveFileupload()
{
if (!Request.Content.IsMimeMultipartContent("form-data"))
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
// Prepare CustomMultipartFormDataStreamProver in which our multipart form data will be loaded
string fileSaveLocation = HttpContext.Current.Server.MapPath("~/UploadedFiles");
CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(fileSaveLocation);
List<string> files = new List<string>();
Duck duck = null;
try
{
// Read all contents of multipart message into CustomMultipartFormDataStreamProvider
await Request.Content.ReadAsMultipartAsync(provider);
// Parse an ID which is passed in the form data
long id;
if (!long.TryParse(provider.FormData["id"], out id))
{
return Request.CreateResponse(HttpStatusCode.ExpectationFailed, "Couldn't determine id.");
}
duck = db.Ducks.Find(id);
if (null == duck)
return Request.CreateResponse(HttpStatusCode.NotAcceptable, "Duck with ID " + id + " could not be found.");
// Loop through uploaded files
foreach (MultipartFileData file in provider.FileData)
{
// File ending needs to be xml
DoSomething();
// On success, add uploaded file to list which is returned to the client
files.Add(file.LocalFileName);
}
// Send OK Response along with saved file names to the client.
return Request.CreateResponse(HttpStatusCode.OK, files);
}
catch (System.Exception e) {
return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
}
}
我如何保证文件将以原子方式存储和重命名?与其使用原始名称然后重命名,为什么不在上载代码中动态生成名称 e、 g.如果文件显示为“
foo.xml
”,则将其作为“BodyPart_be42560e-863d-41ad-8117-e1b634e928aa
”写入磁盘
另外请注意,如果您将文件上载到“~/UploadedFiles”
,任何人都可以使用www.example.com/UploadedFiles/name.xml这样的URL下载该文件,您应该将文件存储在~/App\u Data/
中以防止出现这种情况
更新:
为什么不删除对GetLocalFileName
方法的重写,只在基类中使用原始方法呢
public virtual string GetLocalFileName(HttpContentHeaders headers)
{
if (headers == null)
{
throw Error.ArgumentNull("headers");
}
return String.Format(CultureInfo.InvariantCulture, "BodyPart_{0}", Guid.NewGuid());
}
这样可以将每个文件保存为唯一的名称,而无需以后重命名。与其使用原始名称然后重命名,为什么不在上载代码中动态生成名称
e、 g.如果文件显示为“foo.xml
”,则将其作为“BodyPart_be42560e-863d-41ad-8117-e1b634e928aa
”写入磁盘
另外请注意,如果您将文件上载到“~/UploadedFiles”
,任何人都可以使用www.example.com/UploadedFiles/name.xml这样的URL下载该文件,您应该将文件存储在~/App\u Data/
中以防止出现这种情况
更新:
为什么不删除对GetLocalFileName
方法的重写,只在基类中使用原始方法呢
public virtual string GetLocalFileName(HttpContentHeaders headers)
{
if (headers == null)
{
throw Error.ArgumentNull("headers");
}
return String.Format(CultureInfo.InvariantCulture, "BodyPart_{0}", Guid.NewGuid());
}
这应该将每个文件保存为唯一的名称,而不必在以后重命名。为什么不将文件创建为元组?第一个字符串是原始文件名(file.LocalFileName),第二个字符串是所需的(重命名的)文件名为什么不将文件创建为元组?第一个字符串是原始文件名(file.LocalFileName),所需的第二个字符串(重命名)filename@Explicat:答案已更新。如果您需要进一步的帮助,请告诉我。@explicate:Answer-updated。如果你需要进一步的帮助,请告诉我。