代码之家  ›  专栏  ›  技术社区  ›  ForceMagic

如何根据请求散列和下载图像?

  •  0
  • ForceMagic  · 技术社区  · 6 年前

    情况

    我想实现的是,将一个图像下载到缓冲区,对其进行散列, 然后 省省吧。

    我无法写入磁盘 之前 散列。

    代码(在承诺中)

    const filename = this.getPathFromHash(hash);
    if (!fs.existsSync(path.dirname(filename))) fs.mkdirSync(path.dirname(filename));
    fs.writeFile(filename, body, 'binary', (e) => {
      if (e) reject(e);
      parser.MediumVersion.create({
        hash, url, type, size, width, height,
      }).then(resolve).catch(reject);
    });
    

    后果

    文件损坏,但它创建了以下文件:)

    编辑:IrFanView说它是带有错误扩展名的JPEG,然后它只是说 一个jpeg文件,以(此处为两个随机字节)开头

    编辑2:这是什么??四个0xfd字节?这是什么意思?否则,图像标题看起来正常。

    fdfdfdfd

    Edit3:删除这些字节并不能解决问题:/也许编码是罪魁祸首?我试着把它改成 UTF-8 到目前为止运气不好。

    Edit4:快速比较!第一个是用我的程序下载的,第二个是Chrome。

    comparison

    目录结构

    我知道,我知道,SHA-256哈希值有64个字符长。为了简单起见,我将使用8个字符。

    考虑到散列 0123abcd ,创建目录 01 (如果它不存在( slice(0,2) ),然后将文件名 23abcd ( slice(2) )在里面。我在很多缓存中见过这种结构。

    例子:

    01/
      23abcd
      45abcd
    ab/
      cdef01
      010101
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   ForceMagic    6 年前

    根据 https://github.com/request/request#requestoptions-callback :

    如果需要二进制数据,则应设置 encoding: null .

    所以对我来说那就是 request(url, { encoding: null }, (e, resp, body) => {...}) .

    在这种情况下,图像非常精细且可读:)