Java - преобразовать URI данных в файл [duplicate]

Если вы пытаетесь зарегистрировать все ошибки, убедитесь, что вы сохранили строку Task.WhenAll в своем коде, многие комментарии предполагают, что вы можете удалить ее и дождаться отдельных задач. Task.WhenAll действительно важна для обработки ошибок. Без этой строки вы потенциально оставляете свой код открытым для незаметных исключений.

var catTask = FeedCat();
var houseTask = SellHouse();
var carTask = BuyCar();

await Task.WhenAll(catTask, houseTask, carTask);

var cat = await catTask;
var house = await houseTask;
var car = await carTask;

Представьте, что FeedCat генерирует исключение в следующем коде:

var catTask = FeedCat();
var houseTask = SellHouse();
var carTask = BuyCar();

var cat = await catTask;
var house = await houseTask;
var car = await carTask;

В этом случае вы никогда не будете ждать houseTask или carTask. Существует 3 возможных сценария:

  1. SellHouse уже успешно завершен, когда FeedCat не удалось. В этом случае вы в порядке.
  2. SellHouse не является полным и в какой-то момент не работает с ошибкой. Исключение не наблюдается и будет возвращено в финализацию.
  3. SellHouse не является полным и содержит в нем ожидания. В случае, если ваш код работает в ASP.NET, SellHouse завершится с ошибкой, как только некоторые из ожиданий будут завершены внутри него. Это происходит потому, что вы в основном сделали огонь и amp;

Вот ошибка, которую вы получите для случая (3):

System.AggregateException: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext)
   at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext)
   at System.Web.HttpApplication.System.Web.Util.ISyncContext.Enter()
   at System.Web.Util.SynchronizationHelper.SafeWrapCallback(Action action)
   at System.Threading.Tasks.Task.Execute()
   --- End of inner exception stack trace ---
---> (Inner Exception #0) System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext)
   at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext)
   at System.Web.HttpApplication.System.Web.Util.ISyncContext.Enter()
   at System.Web.Util.SynchronizationHelper.SafeWrapCallback(Action action)
   at System.Threading.Tasks.Task.Execute()<---

Для случая ( 2) вы получите аналогичную ошибку, но с исходной трассировкой стека исключений.

Для .NET 4.0 и более поздних версий вы можете поймать ненаблюдаемые исключения, используя TaskScheduler.UnobservedTaskException. Для .NET 4.5 и более поздних ненаблюдаемых исключений по умолчанию пропущено исключение unobserved .NET 4.0 приведет к сбою вашего процесса.

Подробнее здесь: Обработка исключений задач в .NET 4.5

12
задан Daniel 2 September 2013 в 10:17
поделиться

2 ответа

Как уже отмечалось, данные изображения кодируются Base64. Чтобы получить двоичные данные, вам нужно снять заголовки типа / кодировки, а затем декодировать содержимое Base64 на двоичные данные.

String encodingPrefix = "base64,";
int contentStartIndex = dataUrl.indexOf(encodingPrefix) + encodingPrefix.length();
byte[] imageData = Base64.decodeBase64(dataUrl.substring(contentStartIndex));

Я использую org.apache.commons.codec.binary.Base64 из apache common-codec, другие декодеры Base64 должны работать также.

17
ответ дан ChristophT 20 August 2018 в 10:25
поделиться

Единственная проблема с строкой RFC2397 - это ее спецификация со всеми данными перед данными, но data: и , необязательно:

data:[<mediatype>][;base64],<data>

. Так чистое решение для решения Java 8 это будет:

final int dataStartIndex = dataUrl.indexOf(",") + 1;
final String data = dataUrl.substring(dataStartIndex);
byte[] decoded = java.util.Base64.getDecoder().decode(data);

Конечно, dataStartIndex должен быть проверен.

3
ответ дан Roman Nikitchenko 20 August 2018 в 10:25
поделиться
Другие вопросы по тегам:

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