草庐IT

javascript - Webkit JavaScript 可以 PUT 或 POST 图像 REST 样式作为纯二进制文件吗?

coder 2024-07-26 原文

当我的浏览器从网站下载图像时,不涉及 base64 编码。它发出类似 GET/image.jpg 的 HTTP 命令并接收 Content-Type 类似于 image/jpg 的 HTTP 响应,其 Content-Length是图像中的字节数,其主体是原始二进制图像数据本身。数据既未使用字符集编码,也未使用 base64 等方案进行编码。

编写 RESTful 资源训练我期待 HTTP GETPUT 之间的对称性,例如,当我执行 时,一个 URL 会传送 JSON 数据当使用 PUT 时,GET 将接受 JSON 数据。在这两种情况下都不涉及表单编码;在这两种情况下,只有一个 Content-Length 给出有效载荷中的字节数,一个 Content-Type header 声明有效载荷是某种字符集中的 JSON,以及然后字符数据作为 GETPUT 的主体单独存在且未经修饰。

我正在编写一个 PhoneGap 应用程序,它允许用户拍照并使用我的应用程序上传照片。我曾期望我可以为此设计一个 RESTful 接口(interface),它支持对称的 GETPUT — 这样 PUT 命令就不会涉及特殊编码,也不涉及任何字符集的概念,只是简单地使用 image/jpgContent-Type 和大量二进制 JPG 数据作为其有效负载。显然,这比尝试在表单内对图像进行编码更有效地利用带宽。当我使用 curl 之类的工具 PUT 到 URL 时,这种方法效果很好。

但是我没有运气从 PhoneGap WebKit JavaScript 做一个干净的 RESTful PUT! PhoneGap 愿意将图像作为本地 file: URL 或作为 data: URL 返回到我的 JavaScript,该 URL 通过 base64 编码以内联方式承载图像数据。但是在这两种情况下,我都找不到将图像转换为纯二进制格式的明确方法(我会为此使用那些新奇的 Blob 对象之一吗?如果是这样,怎么做?)然后导致 PUT,在不使用额外的表单层或编码杂物来装饰请求的情况下,将简单地将原始图像作为 HTTP 请求负载通过网络传输到我的 Web 服务器。

有谁知道如何让 WebKit PUT 以原始图像作为主体的 AJAX 请求?感谢您提供任何指示——甚至是任何有用的答案,以说明我正在处理这一切都是错误的!

最佳答案

至于二值图像处理,Binary File Inspector demo作为端到端示例可能会有所帮助。

MDN 上有一些关于从文件系统中获取 Blob 主题的教程信息。 . This blog post描述了如何将 base64 URI 转换为 ArrayBuffer,然后转换为 Blob

最后,可以上传ArrayBufferBlob using the XMLHttpRequest2 interface .

The XHR2 spec seems to imply支持 PUT 以及许多其他 HTTP 方法。因此,结合所有这些,您可以将文件填充到 Blob 中,然后使用 XHR2 将它们发送出去。


base64-binary.js 的帮助下使用 base64 解码方法的未经测试的代码示例:

var BASE_64_PREFIX = "base64,";
function getBase64Content(base64Uri) {
   var index = base64Uri.indexOf(BASE_64_PREFIX);
   return base64Uri.substring(index + BASE_64_PREFIX.length);
}

function put(uri, data, onComplete) {
    var xhr = new XMLHttpRequest();
    xhr.open("PUT", uri, true);
    xhr.onload = onComplete;

    xhr.send(data);
}

var base64Uri = fromPhoneGap();
var base64Content = getBase64Content(base64Uri);
var arrayBuffer = Base64Binary.decodeArrayBuffer(base64Content);

put("/some/uri", arrayBuffer, function () {
    console.log("All done");
});

也就是说,我怀疑即使是最新的桌面 WebKit 也能在很大程度上实现这一点,更不用说您将要通过 PhoneGap 使用的版本了。您可能不适合利用这些规范草案。

关于javascript - Webkit JavaScript 可以 PUT 或 POST 图像 REST 样式作为纯二进制文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650804/

有关javascript - Webkit JavaScript 可以 PUT 或 POST 图像 REST 样式作为纯二进制文件吗?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  4. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  5. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  6. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

  7. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  8. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  9. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  10. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

随机推荐