使用正确的文件名将文件对象转换为图像而不是src =" blob ..."

时间:2016-06-09 13:02:53

标签: javascript image image-processing filereader fileapi

我在控制台中有一个File对象import scala.collection.GenTraversableOnce import scala.collection.generic.CanBuildFrom implicit class ListEx[A](list: List[A]) { def flatMap2[B, M[_], That](f: A => M[B]) (implicit bf: CanBuildFrom[List[A], B, That], view: M[B] => GenTraversableOnce[B]): That = list.flatMap(f andThen view) } val p: Int => Option[Int] = Some(_) List(1, 2, 3) flatMap2 p

myFile

但是当我使用

创建一个图像时
File {
  name: "myimage.jpg", 
  lastModified: 1465476925001, 
  lastModifiedDate: Thu Jun 09 2016 14:55:25 GMT+0200 (CEST), 
  size: 33002
  type: "image/jpeg"
}

我明白了:

var image = new Image();
image.src = URL.createObjectURL(myFile);

当我尝试右键单击保存文件时,文件名为空或" 6b2b83d8-ac36-40c1-8ab1-c4f07b019ba5"而不是" myimage.jpg"。文件对象中的文件名已消失。有没有办法设置图像文件名?

1 个答案:

答案 0 :(得分:5)

问题

File对象是Blob的扩展版本,允许它保存文件名,大小等元数据。

但是,虽然createObjectURL()将同时引用FileBlob,但通过blob:协议读取的数据仅包含二进制文件数据通过其他协议加载时本身。不会通过协议提供元数据(例如文件名)。

不考虑文件名的其他示例可能是通过例如PHP或ASPX页面(/getimage.aspx?id=1)加载图像时。此外,没有提供元数据,浏览器会在这种情况下建议使用类似“ getimage.aspx%3Fid = 1 ”的文件名。正如所料。

即使在源点使用了一个文件名,IMG标签本身也不会假设任何文件名;它只保存通过src属性/属性原样给出的内容,作为检索所需二进制数据以进行解码的连接点。

在这种情况下,源点为blob:*/*,它将是IMG标记通过src引用的内容,并且是浏览器在保存数据时使用的内容。

变通方法

保留File对象中文件名的唯一方法是跟踪它,以便在需要下载时可以访问它。

但这也是有限的,因为您只能使用download标记中的A属性指定文件名。当然,某些浏览器(例如< = IE11)不支持此属性。

<a href="blob:.." download="filename.jpg"><img ..></a>

在IE10 +中,可以使用proprietary method msSaveBlob()代替:

window.navigator.msSaveBlob(myBlob, 'filename.jpg');

除了这些之外,没有通用的方法在客户端内指定默认文件名。

<强> Example fiddle