JaxTeller61 Ответов: 1

Как избежать исключения system.io.pathtoolongexception?


Когда я попытался загрузить изображение с моего сайта я получил эту ошибку (
The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
) Мне нужно избегать
System.IO.PathTooLongException
но не могу этого понять

моя часть загрузки выглядит так

<pre>if (FileUpload1.HasFile)
        {
            string FileExtension = System.IO.Path.GetExtension(FileUpload1.FileName);
            if (FileExtension.ToLower() == ".png")
            {
                if (FileUpload1.FileBytes.Length < 10000000)
                {
                    System.IO.Stream fs = FileUpload1.PostedFile.InputStream;
                    System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
                    Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                    string base64String = Convert.ToBase64String(bytes, 0, bytes.Length);
                    Image1.ImageUrl = "data:image/png;base64," + base64String;
                    Image1.Visible = true;
                    Bitmap bmp = new Bitmap(fs);
                    stegoImg = new StegoImage(bmp);
                }



И моя часть загрузки выглядит так

string url = Image1.ImageUrl;
        string FileExtension = System.IO.Path.GetExtension(FileUpload1.FileName);
        string FileName = FileUpload1.FileName;

        WebClient client = new WebClient();
        client.DownloadFile(url, Server.MapPath((FileUpload1.FileName)+FileName));


Что я уже пробовал:

Я пытался использовать библиотеку Delimon, но я не могу справиться с этим

Bryian Tan

Вместо сохранения в физическом каталоге на сервере (это может быть d:\yourserver\grandparentfolder\parentfolder\otherfolder\morefolder\HereIsMyApplicationFolder).

Можете ли вы изменить логику сохранения файла в другом месте? Как d:\download

Использование WebClient для загрузки файла в папку dowload по умолчанию[^]

1 Ответов

Рейтинг:
2

OriginalGriff

Хм.
Посмотрите на свой код:

        string FileName = FileUpload1.FileName;
...
        client.DownloadFile(url, Server.MapPath((FileUpload1.FileName)+FileName));
Таким образом, ваше имя файла находится там дважды для начала; удаление одного из них может значительно сократить имя файла.

Кроме этого, мы ничего не можем сделать, чтобы помочь, если вы не переместите свою папку. Когда вы используете MapPath без каких-либо ссылок на папки, вы получаете путь относительно текущей веб-страницы, и мы не имеем никакого контроля над этим, так как он будет относительно корневого каталога Вашего веб-сайта в сочетании со структурой папок, которую вы выбрали для своей веб-страницы. Переместив загруженные файлы в определенную папку в корне вашего сайта, вы сможете достаточно сократить его название:
client.DownloadFile(url, Server.MapPath("~/Uploads/" + FileName));

Но... Я бы не стал хранить такие файлы.
Это сайт, который по своей природе является многопользовательским. Если вы храните файлы с оригинальными именами файлов, thera будут конфликтовать, и это означает, что версия UserA будет перезаписана версией UserB. Лучшим решением является хранение фактического файла под временным именем (GUID хороши для этого) и перекрестная ссылка на исходное имя файла и / или пользователя через базу данных.