如何将图像文件放在json对象中?

时间:2015-12-27 22:17:22

标签: javascript arrays json mongodb

我正在建立一个视频游戏数据库,每个数据库都包含游戏的名称,流派和图像等元素。是否可以将图像放入数据库的json对象?如果没有办法解决这个问题?

5 个答案:

答案 0 :(得分:34)

我可以想到以两种方式做到这一点:

1

将文件存储在任何目录(例如dir1)的文件系统中并重命名,以确保每个文件的名称都是唯一的(可能是时间戳)(比如说xyz123.jpg),然后将此名称存储在某些DataBase中。然后在生成JSON时,您将获取此文件名并生成完整的URL(将为http://example.com/dir1/xyz123.png)并将其插入JSON中。

2

Base 64编码,它基本上是一种用ASCII文本编码任意二进制数据的方法。每3字节数据需要4个字符,最后可能还有一些填充。基本上每6位输入都用64个字符的字母表编码。 “标准”字母表使用A-Z,a-z,0-9和+和/,其中=作为填充字符。有URL安全的变种。因此,这种方法将允许您将图像直接放在MongoDB中,同时存储它对图像进行编码并在获取图像时进行解码,它有一些自身的缺点:

  • base64编码使文件大小比原始二进制表示大约33%,这意味着更多的数据(这可能在移动网络上非常痛苦)
  • IE6或IE7不支持数据URI。
  • base64编码数据可能需要比二进制数据更长的处理时间。

Source

将图像转换为数据URI

A。)画布

将图像加载到Image-Object中,将其绘制到画布并将画布转换回dataURL。

function convertToDataURLviaCanvas(url, callback, outputFormat){
    var img = new Image();
    img.crossOrigin = 'Anonymous';
    img.onload = function(){
        var canvas = document.createElement('CANVAS');
        var ctx = canvas.getContext('2d');
        var dataURL;
        canvas.height = this.height;
        canvas.width = this.width;
        ctx.drawImage(this, 0, 0);
        dataURL = canvas.toDataURL(outputFormat);
        callback(dataURL);
        canvas = null; 
    };
    img.src = url;
}

<强> 用法

convertToDataURLviaCanvas('http://bit.ly/18g0VNp', function(base64Img){
    // Base64DataURL
});

支持的输入格式  image/pngimage/jpegimage/jpgimage/gifimage/bmpimage/tiffimage/x-iconimage/svg+xml,{{ 1}},image/webp

B。)FileReader

通过XMLHttpRequest将图像加载为blob,并使用FileReader API将其转换为数据URL。

image/xxx

这种方法

  • 缺乏浏览器支持
  • 有更好的压缩
  • 也适用于其他文件类型。

<强> 用法

function convertFileToBase64viaFileReader(url, callback){
    var xhr = new XMLHttpRequest();
    xhr.responseType = 'blob';
    xhr.onload = function() {
      var reader  = new FileReader();
      reader.onloadend = function () {
          callback(reader.result);
      }
      reader.readAsDataURL(xhr.response);
    };
    xhr.open('GET', url);
    xhr.send();
}

Source

答案 1 :(得分:12)

JSON格式只能包含这些类型的值:

  • 字符串
  • 物体
  • 阵列

图像属于&#34;二进制&#34;这些都不是。 因此,您无法直接将图像插入JSON。您可以做的是将图像转换为文本表示,然后可以将其用作普通字符串。

实现这一目标的最常见方式是使用名为base64的内容。基本上,它不是将其编码为10,而是使用64个字符的范围,这使得它的文本表示更紧凑。例如,数字&#39; 64&#39;在二进制中表示为1000000,而在base64中它只是一个字符:=

有多种方法可以在base64中对图像进行编码,具体取决于您是否要执行in the browser

请注意,如果您正在开发Web应用程序,以二进制形式单独存储图像,并在JSON或其他地方存储这些图像的路径会更有效。这也允许您的客户端浏览器缓存图像。

答案 2 :(得分:4)

使用数据网址方案:https://en.wikipedia.org/wiki/Data_URI_scheme

在这种情况下,您可以直接在html中使用该字符串:With ThisWorkbook.Sheets("CSVImport") .Rows(1).Copy Destination:=ThisWorkbook.Sheets(strAccount).Cells(2, 1)

答案 3 :(得分:1)

要将文件直接上传到Mongo DB,您可以使用Grid FS。虽然我建议您将文件上传到文件系统中的任何位置,并将图像的URL放在JSON对象中,但是当您调用特定对象的数据时,可以使用URL调用图像。

告诉我你使用的是哪种后端技术?我可以基于此提出更多建议。

答案 4 :(得分:1)

<?php
$target_path  = "./Upload/";
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['uploadedfile']['name']).    " has been uploaded";
} else {
    echo "There was an error uploading the file, please try again!";
}

?>

PHP文件

options("digits.secs"=6)