有没有办法在不保存的情况下重命名上传的文件?
Is there a way to rename the uploaded file without saving it?
我试着调查 other solutions
,但他们建议:
- 到
save the file
的名称与 saveAs()
不同
- 将文件名
once the file is saved
更改为Move()
或Copy()
就我而言 I need to rename it without saving it
。我尝试更改 file.FileName
属性,但它是 ReadOnly
。
我想要得到的结果是:
public HttpPostedFileBase renameFiles(HttpPostedFileBase file)
{
//change the name of the file
//return same file or its copy with a different name
}
它将 good to have
HttpPostedFileBase
作为 return type
,但如果需要,它 can be sacrificed
。
有没有办法通过 memory streams
或其他方式做到这一点?感谢您的帮助,感谢您花时间阅读本文。 :)
简答:否
长答案:
仅当文件系统上存在文件时,您才能重命名文件。
上传的文件根本不是文件 - 当您使用 Request.Files 访问它们时。它们是溪流。由于同样的原因,文件名 属性 是只读的。
没有与流关联的名称。
根据文档,文件名 属性
Gets the fully qualified name of the file on the client.
好吧,我终于找到了一种非常简单的方法 - 我想我有点想多了。我想我会分享解决方案,因为你们中的一些人可能需要它。我测试了它,它对我有用。
您只需要 create your own class
HttpPostedFileBaseDerived
继承自 HttpPostedFileBase
。它们之间的唯一区别是您可以在那里创建构造函数。
public class HttpPostedFileBaseDerived : HttpPostedFileBase
{
public HttpPostedFileBaseDerived(int contentLength, string contentType, string fileName, Stream inputStream)
{
ContentLength = contentLength;
ContentType = contentType;
FileName = fileName;
InputStream = inputStream;
}
public override int ContentLength { get; }
public override string ContentType { get; }
public override string FileName { get; }
public override Stream InputStream { get; }
public override void SaveAs(string filename) { }
}
}
自 constructor is not affected by ReadOnly
以来,您可以轻松地 copy in the values from your original file
对象 to
您的 derived class's instance
,同时输入您的新名称:
HttpPostedFileBase renameFile(HttpPostedFileBase file, string newFileName)
{
string ext = Path.GetExtension(file.FileName); //don't forget the extension
HttpPostedFileBaseDerived test = new HttpPostedFileBaseDerived(file.ContentLength, file.ContentType, (newFileName + ext), file.InputStream);
return (HttpPostedFileBase)test; //cast it back to HttpPostedFileBase
}
完成后,您可以 type cast
将其返回 HttpPostedFileBase
,这样您就不必更改已有的任何其他代码。
希望这对以后的任何人都有帮助。也感谢 Manoj Choudhari 的回答,感谢我知道了在哪里不应该寻找解决方案。
我试着调查 other solutions
,但他们建议:
- 到
save the file
的名称与saveAs()
不同
- 将文件名
once the file is saved
更改为Move()
或Copy()
就我而言 I need to rename it without saving it
。我尝试更改 file.FileName
属性,但它是 ReadOnly
。
我想要得到的结果是:
public HttpPostedFileBase renameFiles(HttpPostedFileBase file)
{
//change the name of the file
//return same file or its copy with a different name
}
它将 good to have
HttpPostedFileBase
作为 return type
,但如果需要,它 can be sacrificed
。
有没有办法通过 memory streams
或其他方式做到这一点?感谢您的帮助,感谢您花时间阅读本文。 :)
简答:否
长答案: 仅当文件系统上存在文件时,您才能重命名文件。
上传的文件根本不是文件 - 当您使用 Request.Files 访问它们时。它们是溪流。由于同样的原因,文件名 属性 是只读的。
没有与流关联的名称。
根据文档,文件名 属性
Gets the fully qualified name of the file on the client.
好吧,我终于找到了一种非常简单的方法 - 我想我有点想多了。我想我会分享解决方案,因为你们中的一些人可能需要它。我测试了它,它对我有用。
您只需要 create your own class
HttpPostedFileBaseDerived
继承自 HttpPostedFileBase
。它们之间的唯一区别是您可以在那里创建构造函数。
public class HttpPostedFileBaseDerived : HttpPostedFileBase
{
public HttpPostedFileBaseDerived(int contentLength, string contentType, string fileName, Stream inputStream)
{
ContentLength = contentLength;
ContentType = contentType;
FileName = fileName;
InputStream = inputStream;
}
public override int ContentLength { get; }
public override string ContentType { get; }
public override string FileName { get; }
public override Stream InputStream { get; }
public override void SaveAs(string filename) { }
}
}
自 constructor is not affected by ReadOnly
以来,您可以轻松地 copy in the values from your original file
对象 to
您的 derived class's instance
,同时输入您的新名称:
HttpPostedFileBase renameFile(HttpPostedFileBase file, string newFileName)
{
string ext = Path.GetExtension(file.FileName); //don't forget the extension
HttpPostedFileBaseDerived test = new HttpPostedFileBaseDerived(file.ContentLength, file.ContentType, (newFileName + ext), file.InputStream);
return (HttpPostedFileBase)test; //cast it back to HttpPostedFileBase
}
完成后,您可以 type cast
将其返回 HttpPostedFileBase
,这样您就不必更改已有的任何其他代码。
希望这对以后的任何人都有帮助。也感谢 Manoj Choudhari 的回答,感谢我知道了在哪里不应该寻找解决方案。