Сохраненный загруженный pdf как байты, но неспособный прочитать [дубликат]

Другой способ ответить на это, вместо того, чтобы увязнуть в тайных деталях точек последовательности и неопределенного поведения, - это просто спросить, , что они должны означать? Что было программистом пытаясь сделать?

Первый фрагмент, о котором спросили, i = i++ + ++i, в моей книге довольно сумасшедший. Никто никогда не напишет его в реальной программе, не очевидно, что он делает, нет никакого мыслимого алгоритма, который кто-то мог бы попытаться закодировать, что привело бы к этой конкретной надуманной последовательности операций. И поскольку для вас и меня не очевидно, что он должен делать, это прекрасно в моей книге, если компилятор не может понять, что он должен делать.

Второй фрагмент i = i++ , немного легче понять. Кто-то явно пытается увеличить i и присвоить результат i. Но есть несколько способов сделать это в C. Самый простой способ добавить 1 к i и присвоить результат обратно i, тот же почти для любого языка программирования:

i = i + 1

C , конечно, имеет удобный ярлык:

i++

Это означает, что «добавьте 1 к i и присвойте результат обратно i». Итак, если мы построим мешанину из двух, написав

i = i++

, то, что мы действительно говорим, это «добавить 1 к i» и присвоить результат обратно i, и присвоить результат обратно i ». Мы сбиты с толку, поэтому меня это слишком беспокоит, если компилятор тоже запутался.

Реально, единственный раз, когда эти сумасшедшие выражения получаются написанными, когда люди используют их как искусственные примеры того, как ++ должен работать. И, конечно же, важно понимать, как работает ++. Но одно практическое правило для использования ++: «Если не очевидно, что означает выражение, использующее ++, не пишите».

Мы проводили бесчисленные часы на comp.lang.c, обсуждая выражения, подобные этим, и , почему они не определены. Два моих более длинных ответа, которые пытаются объяснить, почему, заархивированы в Интернете:

2
задан Josh 17 May 2013 в 22:31
поделиться

1 ответ

Это действительно помогает понять, что вы делаете в коде, поэтому я попросил показать его. Я угадал , ваш код выглядит так:

var f = $("image").files[0];
var reader = new FileReader();
reader.readAsBinaryString(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});

Теперь, когда вы говорите:

Я получаю вывод следующим образом:

GIF89a,úæÿÿÿ2c½3...

Is мой вывод [...] двоичные данные?

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

Это зависит от того, как вы выводите его на свою страницу, но браузер может или не может применять определенную кодировку к полученным данным (инспекция Fiddler может научить вас больше то, что отправляется по HTTP-проводу) и отображать его как более или менее читаемый текст.

Это не относится к вашей переменной image, хотя, которая содержит фактические двоичные данные из readAsBinaryString() приводит в виде «исходные двоичные данные [sic]» . О, небрежно напечатанный, кто заботится о том, что вы возвращаетесь. Надеюсь / надеюсь массив байтов. Теперь вам нужно отправить это на сервер. Предпочтительно загрузки файлов обрабатываются элементами <input type="file" />, но иногда вам нужно делать что-то с помощью AJAX. Вы не можете действительно загружать реальные файлы через JavaScript, хотя, насколько я знаю, поддержка браузера кажется возрастающей.

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

Сначала убедитесь, что запрос сделан с content-type в application/x-www-form-urlencoded. Вы можете проверить это в Fiddler или посоветоваться с руководством . Последний вообще не упоминает какую-либо кодировку, вы должны понять, что вне .

Теперь вам нужно url-encode бинарные данные, чтобы опубликовать его. Эта функция возвращает входные байты, интерпретируемые как UTF-8, в виде строки с кодировкой URL, которая может быть безопасно размещена. Затем serveride, вы можете заменить

System.Text.Encoding.GetEncoding («ISO-8859-1»). GetBytes (_Context.Request [«Изображение»]);

< / blockquote>

С

System.Text.Encoding.UTF8 .GetBytes (_Context.Request ["Изображение"]);

Но почему у вас есть содержимое файла в этой форме? Как , этот ответ упоминает, что FileReader также содержит метод readAsDataURL , который позволяет вам использовать reader.result непосредственно как переменную POST.

Итак, ваш код будет выглядеть следующим образом:

var f = $("image").files[0];
var reader = new FileReader();
reader.readAsDataURL(f);
var image = reader.result;

$.ajax({
    url: theUrl,
    type: 'POST',
    data: { Image: image }
});

Затем, на сервере, вам придется декодировать данные с базы 64:

byte[] imageBytes = System.Convert.FromBase64String(_Context.Request["Image"]);

Как это работает?

8
ответ дан Community 23 August 2018 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: