有没有一种方法可以重命名上载的文件而不保存它?

时间:2019-02-20 17:05:30

标签: c# asp.net memorystream

我尝试研究other solutions,但是他们建议:

  1. save the file用不同名称的saveAs()
  2. 使用once the file is savedMove()更改文件名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的{​​{1}} HttpPostedFileBase,但是如果需要,它是return type

是否可以通过can be sacrificed或其他方式做到这一点?感谢您的帮助,感谢您抽出宝贵的时间阅读本文档。 :)

2 个答案:

答案 0 :(得分:1)

简短答案:

详细答案: 仅当文件系统上存在文件时,才能重命名文件。

上载的文件根本不是文件-当您使用Request.Files访问它们时。他们是溪流。由于相同的原因,fileName属性为只读。

没有与流关联的名称。

根据文档的FileName属性

  

获取客户端上文件的标准名称。

答案 1 :(得分:0)

好吧,我终于找到了一种非常简单的方法-我想我对此有点想过。我想我将只分享解决方案,因为其中一些人可能需要它。我测试了它,对我有用。

您只需要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的回答,也要感谢我了解到哪里不寻求解决方案。