我有一个基本的 HTML 表单,我可以从中获取一些我在 Firebug 中检查的信息。
我唯一的问题是我试图在文件数据发送到服务器之前对文件数据进行 base64 编码,服务器需要以这种形式保存到数据库中。
<input type="file" id="fileupload" />
在 Javascript+jQuery 中:
var file = $('#fileupload').attr("files")[0];
我有一些基于可用 javascript 的操作: .getAsBinary()、.getAsText()、.getAsTextURL
但是,这些都不会返回可以插入的可用文本,因为它们包含 不可用的“字符” ——我不想在上传的文件中出现“回发”,我需要有多个针对特定对象的表单,所以我很重要获取文件并以这种方式使用 Javascript。
我应该如何以可以使用广泛可用的 Javascript base64 编码器之一的方式获取文件!
谢谢
更新 - 从这里开始赏金,需要跨浏览器支持!!!
这是我所在的位置:
<input type="file" id="fileuploadform" />
<script type="text/javascript">
var uploadformid = 'fileuploadform';
var uploadform = document.getElementById(uploadformid);
/* method to fetch and encode specific file here based on different browsers */
</script>
跨浏览器支持的几个问题:
var file = $j(fileUpload.toString()).attr('files')[0];
fileBody = file.getAsDataURL(); // only would works in Firefox
此外,IE 不支持:
var file = $j(fileUpload.toString()).attr('files')[0];
所以我必须替换为:
var element = 'id';
var element = document.getElementById(id);
对于 IE 支持。
这适用于 Firefox、Chrome 和 Safari(但没有正确编码文件,或者至少在发布后文件不正确)
var file = $j(fileUpload.toString()).attr('files')[0];
var encoded = Btoa(file);
还,
file.readAsArrayBuffer()
似乎仅在 HTML5 中受支持?
很多人建议: http ://www.webtoolkit.info/javascript-base64.html
但这只会在 UTF_8 方法在 base64 编码之前返回错误? (或空字符串)
var encoded = Base64.encode(file);
原文由 jordan.baucke 发布,翻译遵循 CC BY-SA 4.0 许可协议
在浏览器端的javascript中完全有可能。
简单的方法:
readAsDataURL() 方法可能已经为您将其编码为 base64。你可能需要去掉开头的东西(直到第一个
,
),但这没什么大不了的。不过,这会带走所有的乐趣。艰难的道路:
如果您想以艰难的方式尝试(或者它不起作用),请查看
readAsArrayBuffer()
。这将为您提供一个 Uint8Array,您可以使用指定的方法。这可能仅在您想弄乱数据本身时才有用,例如在上传之前操纵图像数据或执行其他巫术魔术。有两种方法:
转换为字符串并使用内置的
btoa
或类似的我没有测试所有案例,但对我有用 - 只需获取字符代码
直接从 Uint8Array 转换为 base64
我最近 在浏览器中实现了 tar 。作为该过程的一部分,我制作了自己的直接 Uint8Array->base64 实现。我认为您不需要它,但是如果您想看一下,它就在 这里;它很整洁。
我现在应该做什么:
从 Uint8Array 转换为字符串的代码非常简单(其中 buf 是 Uint8Array):
从那里,只需执行以下操作:
var base64 = btoa(uint8ToString(yourUint8Array));
Base64 现在将是一个 base64 编码的字符串,它应该只上传桃色。如果您想在推送之前仔细检查,请尝试以下操作:
window.open("data:application/octet-stream;base64," + base64);
这会将其下载为文件。
其他信息:
要将数据作为 Uint8Array 获取,请查看 MDN 文档: