Есть ли способ переименовать загруженный файл без его сохранения? - PullRequest
0 голосов
/ 20 февраля 2019

Я попытался заглянуть в other solutions, однако они предлагают либо:

  1. до save the file с другим именем с saveAs()
  2. , чтобы изменить имя файла 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 или что-нибудь еще?Я ценю любую помощь, спасибо, что нашли время, чтобы прочитать это.:)

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Ну, я наконец-то нашел способ, который действительно прост - наверное, я немного обдумал это.Я подумал, что просто поделюсь решением, так как это может понадобиться некоторым из вас.Я проверил это, и оно работает для меня.

Вам просто нужно 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, чтобы вам не пришлось менять какой-либо другой код, который у вас уже есть.

Надеюсь, что этопомогает любому в будущем.Также спасибо Маноджу Чоудхари за его ответ, благодаря чему я узнал, где не искать решение.

0 голосов
/ 20 февраля 2019

Краткий ответ: NO

Длинный ответ: Вы можете переименовать файл, только если файл существует в файловой системе.

Загруженные файлы вообще не являются файлами - при доступе к ним с помощью Request.Files.Это потоки.Свойство fileName доступно только для чтения по той же причине.

Нет имени, связанного с потоком.

Согласно документации, свойство FileName

Получает полное имя файла на клиенте.

...