如何给Blob上传一个FormData文件名?

我目前正在使用下面的代码上传从剪贴板粘贴的图像:

// Turns out getAsFile will return a blob, not a file var blob = event.clipboardData.items[0].getAsFile(), form = new FormData(), request = new XMLHttpRequest(); form.append("blob",blob); request.open( "POST", "/upload", true ); request.send(form); 

发现上传的表单字段收到类似这样的名称:Blob157fce71535b4f93ba92ac6053d81e3a

有没有办法设置这个或接收这个文件名客户端,而不做任何服务器端通信?

对于Chrome和Firefox,只需使用这个:

 form.append("blob",blob, filename); 

(请参阅MDN文档 )

在这里添加这个,因为它似乎不在这里。

除了form.append("blob",blob, filename);的优秀解决scheme, 你也可以把blob变成一个File实例:

 var blob = new Blob([JSON.stringify([0,1,2])], {type : 'application/json'}); var fileOfBlob = new File([blob], 'aFileName.json'); form.append("upload", fileOfBlob); 

由于您将数据粘贴到剪贴板,因此没有可靠的方法来了解文件的来源及其属性(包括名称)。

你最好的办法是提出一个你自己的文件命名scheme,并与blob一起发送。

 form.append("filename",getFileName()); form.append("blob",blob); function getFileName() { // logic to generate file names } 

没有testing过,但是应该提醒blob的数据url:

 var blob = event.clipboardData.items[0].getAsFile(), form = new FormData(), request = new XMLHttpRequest(); var reader = new FileReader(); reader.onload = function(event) { alert(event.target.result); // <-- data url }; reader.readAsDataURL(blob); 

该名称看起来是从一个对象的URL GUID派生的。 执行以下操作以获取名称所源自的对象URL。

 var URL = self.URL || self.webkitURL || self; var object_url = URL.createObjectURL(blob); URL.revokeObjectURL(object_url); 

object_url将被格式化为blob:{origin}{GUID} Google Chrome中的blob:{origin}{GUID}和Firefox中moz-filedata:{GUID} 。 来源是协议的协议+主机+非标准端口。 例如, blob:http://stackoverflow.com/e7bc644d-d174-4d5e-b85d-beeb89c17743blob:http://[::1]:123/15111656-e46c-411d-a697-a09d23ec9a99 。 您可能想要提取GUID并去除任何破折号。

这实际上取决于另一端的服务器是如何configuration的以及如何处理blob post的模块。 您可以尝试将所需的名称放在您的post的path中。

 request.open( "POST", "/upload/myname.bmp", true ); 

您是否在使用Google App Engine? 您可以使用Cookie(使用JavaScript制作)来维护文件名和从服务器收到的名称之间的关系。

当您使用Google Chrome时,您可以为此使用/滥用Google Filesystem API 。 在这里,您可以创build一个具有指定名称的文件,并向其中写入blob的内容。 然后你可以把结果返回给用户。

我还没有findFirefox的好方法, 可能需要像downloadify那样的一小段Flash来命名一个blob。

IE10在BlobBuilder有一个msSaveBlob()函数。

也许这是更多的下载blob,但它是相关的。