asp.net mvc file download - System.FormatException: в заголовке письма был обнаружен недопустимый символ - PullRequest
2 голосов
/ 13 января 2010

На нашем сайте есть файлы на нескольких языках - французском, испанском, португальском и английском. Когда пользователь загружает файл, содержащий специальные символы, такие как ó или ç или ã и т. Д., Я получаю сообщение об ошибке, когда я возвращаю File(data, "application/octet-stream", name); в MVC, я получаю исключение:

System.FormatException: An invalid character was found in the mail header.

Я нашел статью в MSDN, в которой показано, как установить для почтового сообщения кодировку UTF-8, чтобы избежать этого. Но я не знаю, как в кодировке UTF-8 имя файла при использовании файла MVC actionresult. Я нашел в сети статью, в которой UTF-8 кодирует строку, но когда я пытаюсь ее использовать, я получаю имя мусора, так что, думаю, я не понимаю, что кодировка UTF-8 должна делать со строкой. Вот пример кода, найденного в этом сообщении: В заголовке письма обнаружен недопустимый символ

 public static string GetCleanedFileName(string s)
    {

        char[] chars = s.ToCharArray();

        var sb = new StringBuilder();

        for (int index = 0; index < chars.Length; index++)
        {
            string encodedString = EncodeChar(chars[index]);
            sb.Append(encodedString);
        }
        return sb.ToString();
    }


    private static string EncodeChar(char chr)
    {

        var encoding = new UTF8Encoding();

        var sb = new StringBuilder();

        byte[] bytes = encoding.GetBytes(chr.ToString());

        for (int index = 0; index < bytes.Length; index++)
        {
            sb.AppendFormat("%{0}", Convert.ToString(bytes[index], 16));
        }
        return sb.ToString();
    } 

Ответы [ 3 ]

0 голосов
/ 13 января 2010

Я думаю, у меня есть идея, что вы должны преобразовать вашу строку не в utf-8, а в utf-16 потому что utf-8 записывается как я думаю.

UTF-16 представляет каждый символ, используя два байта. UTF-8 использует однобайтовые кодировки символов ASCII для символов ASCII и представляет не-ASCII символы, используя кодировки переменной длины. Имейте в виду, что, хотя UTF-8 может сэкономить место для западных языков, что является аргументом, часто используемым сторонниками, он может использовать до трех байтов на символ для других языков.

И те символы, которые вы написали, не являются ASCII

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

Строка мусора, на которую вы ссылаетесь, является кодированной версией символов. Вы должны увидеть только «мусорную» версию в ответе. При сохранении на диск ОС должна разрешить кодировку и фактически отобразить правильный символ.

Когда вы передаете файл клиенту, код выглядит примерно так:

public ActionResult SaveFile(string fileName)
{
    string fileName = string.Empty; 
    var content=GetContent();
    fileName = CleanFileName(fileName);

    MemoryStream ms = new MemoryStream();
    StreamWriter writer = new StreamWriter(ms, Encoding.UTF8);

    writer.Write(content);
    return File(ms, "text/csv", fileName);
 }

При запуске попытайтесь сохранить файл с именем ó or ç or ã, в ответе вы увидите %c3%b3%20%6f%72%20%c3%a7%20%6f%72%20%c3%a3.

Однако, когда файл сохраняется на диск, это то, что ОС отображает ó or ç or ã

0 голосов
/ 13 января 2010

Возможно попробуйте другую функцию кодирования от и до utf8


//UTF8
        public static string ConvertToUTF8(string inputString)
        {
            string toReturn = "";
            byte[] arr = Encoding.UTF8.GetBytes(inputString);
            for (int i = 0; i &lt arr.Length; i++)
            {
                toReturn += arr[i].ToString() + " ";
            }

            return toReturn;
        }

        public static string ConvertFromUTF8(string inputString)
        {
            inputString = inputString.Trim();
            string result = "";
            string[] parts = inputString.Split(' ');
            byte[] bytes = new byte[parts.Length];
            for (int i = 0; i &lt parts.Length; i++)
            {
                if (parts[i] == "")
                {
                    continue;
                }
                try
                {
                    bytes[i] = Convert.ToByte(parts[i]);
                }
                catch (Exception)
                {
                    MessageBox.Show("Input string was not in a correct format.");
                }

            }

            try
            {
                result = Encoding.UTF8.GetString(bytes);
            }
            catch (Exception)
            {
                throw;
            }
            return result;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...