Как отобразить изображение SVG, полученное из IndexedDB? - PullRequest
0 голосов
/ 22 декабря 2018

У меня проблемы с отображением SVG-изображения, которое я ранее сохранял в локальной IndexDB.Отображаемое изображение SVG отображается со значком вопросительного знака в Safari и значком неработающей ссылки в Firefox.

В моем приложении HTML пользователь может загружать медиа-файлы любого типа, которые я храню в локальной индексной БД.

  1. Импортировать файл мультимедиа:

    <input id="mediafile" type="file" accept="image/jpg, image/jpeg,
          image/png, image/gif, image/svg, image/svg+xml, audio/mp3,
          audio/mpeg, video/mp4, video/quicktime, capture=camcorder">
    

На данный момент это нормально работает для всех приемлемых типов мультимедиа.

Сохранение импортированного файла в IndexDB и создание URL-ссылки на него для целей отображения (упрощенно):

if (file) {
  // Create reader to store file in DB
  reader.readAsArrayBuffer(file); // readAsText // readAsArrayBuffer(file); readAsDataURL
  reader.onload = function(e) {
    // Browser completed reading file - store it with unique key ID
    var uuId = uuidv4();

    // Store file in DB
    dbStoreFile(uuId, e.target.result)
      .then(
        function() {
          // Get file to create thumbnail (image)
          dbGetFileUrl(uuId)
            .then(
              function(url) {
                switch (type) {
                  case 'image':

                    url = window.URL.createObjectURL(file);
                    break;
                  case 'video':
                    ...
                }

                // Create thumbnail
                var preview = document.createElement('img');
                preview.src = url;
                preview.width = '60';
                preview.height = '60';

                // Display thumbnail
                var structure = '<div id="' + uuId + '" projectid="' + projectId + '" style="float: left; height: 60px; width: 60px; margin: 5px; border-style: solid; border-width: 1px; border-color: #b1b1b1; border-radius: 5px;"></div>';
                $('#mediacontainer' + projectId).append(structure);
                $('#mediacontainer' + projectId + ' #' + uuId).append(preview);

                // Remove imported file
                $('#mediafile').val('');

                // Store change in DB
                dbStoreFile('project', project);
              }
            );
        }
      );
  };
}

-> Это прекрасно работает для всех принятых медиафайлов (также SVG) только потому, что я создаю URL-адрес непосредственно из импортированного файла.

Когда я закрываю приложение HTML (или просто перезагружаю его), приложение должно загружать файлы мультимедиа из IndexDB.Это прекрасно работает, за исключением файлов SVG:

function createThumbnail(projectId, uuId, type) {
  var mediaTitle = '';

  var url = '';
  // Get file to create thumbnail (image)
  dbGetFileUrl(uuId)
    .then(
      function(url) {
        // Create thumbnail
        var preview = document.createElement('img');
        preview.src = url;
        preview.width = '60';
        preview.height = '60';

        // Display thumbnail
        var structure = '<div id="' + uuId + '" projectid="' + projectId + '" style="float: left; height: 60px; width: 60px; margin: 5px; border-style: solid; border-width: 1px; border-color: #b1b1b1; border-radius: 5px;"></div>';
        $('#mediacontainer' + projectId).append(structure);
        $('#mediacontainer' + projectId + ' #' + uuId).append(preview);

        $('#mediacontainer' + projectId + ' #' + uuId).attr('src', url);

      }
    );
}

Соответствующее содержимое вызываемой функции dbGetFileUrl:

// Get file blob
var fileBlob = new Blob([request.result.file]); // adding type doesn't help: {type:"image/svg+xml;charset=utf-8"}

// Create URL for blob
var fileURL = window.URL.createObjectURL(fileBlob);
return fileURL;

Я проверил возвращенный URL, который в любом случае выглядит корректно: blob: //https.mypage.com/A5C7DAFE1H....

ThisВремя отображения всех типов мультимедиа, кроме файлов SVG.Вы можете подумать, что сохраненный файл SVG поврежден или что-то в этом роде, но это не так: пользователь может загружать любые медиа-файлы в облако и получать к ним доступ с домашней страницы.Облачный API позволяет мне создавать URL для любого файла в облаке, а затем все загруженные файлы SVG отображаются правильно!

Я предполагаю, что обработка SVG как-то отличается от любых типов носителей (?), Или я проигнорировал что-то простое.Я проверил любые другие проблемы, связанные с отображением файлов SVG в Stackoverflow, но, похоже, ни одна из них не решает эту проблему.Я также пробовал, как 10 различных файлов SVG, но все это не отображается при чтении из indexDB.SVG-файлы не нужно отображать в Canvas для изменения целей.Я просто хочу отобразить его в теге <img> (поскольку это работает для всех других типов изображений).

Файл SVG выглядит одинаково при чтении с помощью функции чтения или при возврате из indexDB:

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 26 26" enable-background="new 0 0 26 26" xml:space="preserve">

<g>
	<path fill="#000000" d="M14.137,17.766c-1.545,0-3.056-0.564-4.195-1.705c-0.637-0.635-0.637-1.663-0.002-2.298   s1.664-0.635,2.298-0.001c1.11,1.108,3.036,0.988,4.293-0.271l5.013-5.013c0.671-0.668,1.054-1.541,1.054-2.395   c0-0.51-0.136-1.25-0.78-1.896c-0.691-0.692-1.484-0.806-2.038-0.778c-0.817,0.037-1.618,0.41-2.255,1.047L14.649,7.33   c-0.672-0.672-3.433-1.165-4.181-0.416l4.756-4.755c1.21-1.21,2.771-1.919,4.4-1.997c1.699-0.078,3.293,0.533,4.487,1.727   c1.119,1.117,1.735,2.607,1.735,4.195c-0.001,1.71-0.732,3.421-2.008,4.693l-5.012,5.012   C17.516,17.104,15.808,17.766,14.137,17.766z"/>
</g>
<g>
	<path fill="#000000" d="M11.863,8.234c1.543,0,3.055,0.564,4.196,1.705c0.636,0.635,0.635,1.663,0,2.298   c-0.634,0.635-1.663,0.635-2.298,0c-1.109-1.107-3.035-0.986-4.293,0.271l-5.013,5.013c-0.67,0.668-1.054,1.541-1.054,2.395   c0,0.508,0.136,1.25,0.781,1.896c0.691,0.69,1.484,0.806,2.038,0.78c0.817-0.039,1.618-0.412,2.255-1.049l2.873-2.872   c0.672,0.671,3.433,1.164,4.182,0.415l-4.756,4.755c-1.209,1.21-2.771,1.919-4.399,1.997c-1.7,0.08-3.294-0.532-4.489-1.727   c-1.119-1.117-1.734-2.607-1.734-4.195c0.001-1.71,0.731-3.421,2.007-4.693l5.012-5.012C8.483,8.898,10.193,8.234,11.863,8.234z"/>
</g>
</svg>

Еще раз: отправленный код работает нормально, только не для файлов SVG, чтобы отобразить их.

...