2012-12-28 134 views
1

我想使用json上传二进制文件。 我选择Json是因为使用该文件我还想发送其他信息。使用Json发布文件

我要通过这样做 -

  1. 选择在文件输入标签的文件。
  2. 使用HTML5文件读取器Api首先读取文件。
  3. 将文件内容转换为base64。
  4. 将base64内容添加到数据uri格式的JS对象中。
  5. 将JS对象转换为json并将其发布到服务器。

我想知道这是否是实现我目标的唯一合法方式?另外,如果有一个插件已经可以在某个地方给我这种能力?

+1

如果您需要发布其他数据,为什么不使用隐藏的输入字段?它更容易实现,因为您不需要混淆文件读取器(兼容性?),Base64编码数据或JSON,只需从POST中获取值即可。 – Cerbrus

+0

我需要使用Ajax。表单提交将不是一个优雅的解决方案。如果我能成功,我会把它转换成一个插件。这样人们可以轻松地上传带有附加数据的文件。 – Tushar

+0

@TusharMathur:如果您坚持使用AJAX,即使您使用HTML5 API,仍然可以坚持已建立的解决方案(例如多部分表单数据)。那里有解决方案使用Flash功能等,但如果你可以使用HTML5,那么它很好。 – Tadeck

回答

0

不,这不是唯一的方法 - 其他方法之一就是提交一个表单,其中包含一个文件。这种形式使用multipart/form-data内容类型。

参见W3C documentation on the subject

内容类型“application/x-www-form-urlencode d”是低效的,用于发送大量的二进制数据或包含非ASCII字符的文本。

内容类型“multipart/form-data”应该用于提交包含文件,非ASCII数据和二进制数据的表单。

因此,没有必要重新发明轮子 - 浏览器已经支持以简单的方式发送文件和附加信息。您只需创建一个表单,用户可以输入数据并选择文件,然后将所有文件发送到服务器,内容类型为multipart/form-data,您的Web框架应该能够理解它处理文件和文本数据。

+0

请考虑数据的大小。据我所知,base64编码的数据最多需要原始文件大小的3倍。 – Tadeck

+0

你的解决方案正是像jQuery文件上传的jQuery插件。我明白你的观点是有效的。那么使用json上传文件没有优势吗?没有用例吗? – Tushar

+0

通常,上传文件时,您不想使用JSON。 您正在将二进制数据转换为普通_text_(base64)。这总是占用更多的空间,更不用说你必须先将文件转换为b64。 – Cerbrus