Javascript 从Chrome扩展向Picasa上传图像

Javascript 从Chrome扩展向Picasa上传图像,javascript,webkit,google-chrome-extension,picasa,Javascript,Webkit,Google Chrome Extension,Picasa,我正试图从Google Chrome扩展插件上传一张图片到Picasa,但在构建帖子时遇到了一些麻烦 这是google为将图像上载到Picasa()指定的协议: 内容类型:多部分/相关;边界=“零件的结束” 内容长度:423478347 MIME版本:1.0 媒体多部分发布 --_部分的结束_ 内容类型:应用程序/atom+xml plz-to-love-realcat.jpg 真正的猫也需要注意。 --_部分的结束_ 内容类型:图像/jpeg …二进制图像数据。。。 --_部分的结束_--

我正试图从Google Chrome扩展插件上传一张图片到Picasa,但在构建帖子时遇到了一些麻烦

这是google为将图像上载到Picasa()指定的协议:

内容类型:多部分/相关;边界=“零件的结束”
内容长度:423478347
MIME版本:1.0
媒体多部分发布
--_部分的结束_
内容类型:应用程序/atom+xml
plz-to-love-realcat.jpg
真正的猫也需要注意。
--_部分的结束_
内容类型:图像/jpeg
…二进制图像数据。。。
--_部分的结束_--
这就是我拼凑起来试图做到的,借用了代码和扩展名“clip it good”:

函数句柄菜单单击(相册名称、相册ID、数据、选项卡){
chrome.pageAction.setTitle({
tabId:tab.id,
标题:“上传('+data.srcUrl.substr(01100)+')”
});
chrome.pageAction.show(tab.id);
var img=document.createElement('img');
img.onload=函数(){
var canvas=document.createElement('canvas');
canvas.width=img.width;
canvas.height=img.height;
canvas.getContext('2d').drawImage(img,0,0);
var dataUrl=canvas.toDataURL();
var dataUrlAdjusted=dataUrl.replace('data:image/png;base64','');
var builder=new WebKitBlobBuilder();
builder.append(Base64.decode(dataUrlAdjusted.buffer);
功能完成(resp、xhr){
chrome.pageAction.hide(tab.id);

如果(!(xhr.status>=200&&xhr.status我的多部分方法看起来几乎相同,只是我通过FileReader.readAsBinaryString(文件)加载文件。但是,Picasa返回了一个错误的请求,其中“非图像”(对于JPG/PNG文件)或“非有效图像”(对于BMP文件)

如果您直接发布图片,它确实有效(201已创建)。以下代码适用于我:

函数上传\u图像(文件,相册ID){
//假设oauth已在后台页面中初始化
var oauth=chrome.extension.getBackgroundPage().oauth;
var方法='POST';
var url='1〕https://picasaweb.google.com/data/feed/api/user/default/albumid/“+albumid;
var xhr=new XMLHttpRequest();
open(方法、url、true);
setRequestHeader(“GData版本”,“3.0”);
setRequestHeader(“内容类型”,file.Type);
setRequestHeader(“Authorization”,oauth.getAuthorizationHeader(url,方法“”);
xhr.onreadystatechange=函数(数据){
if(xhr.readyState==4){
发送图像时(数据,xhr);
}
};
发送(文件);

其中file是FileIO API中的HTML5文件对象。

我猜问题在于服务器期望:Content Type:image/jpeg,而您给它的是base64…我可能遗漏了一些内容,但为什么您有
builder.getBlob('image/png')
,而其他地方的内容类型是jpeg?
Content-Type: multipart/related; boundary="END_OF_PART"
Content-Length: 423478347
MIME-version: 1.0

Media multipart posting
--END_OF_PART
Content-Type: application/atom+xml

<entry xmlns='http://www.w3.org/2005/Atom'>
  <title>plz-to-love-realcat.jpg</title>
  <summary>Real cat wants attention too.</summary>
  <category scheme="http://schemas.google.com/g/2005#kind"
    term="http://schemas.google.com/photos/2007#photo"/>
</entry>
--END_OF_PART
Content-Type: image/jpeg

...binary image data...
--END_OF_PART--
function handleMenuClick(albumName, albumId, data, tab) {
  chrome.pageAction.setTitle({
    tabId: tab.id,
    title: 'Uploading (' + data.srcUrl.substr(0, 100) + ')'
  });
  chrome.pageAction.show(tab.id);

  var img = document.createElement('img');
  img.onload = function() {
    var canvas = document.createElement('canvas');
    canvas.width = img.width;
    canvas.height = img.height;
    canvas.getContext('2d').drawImage(img, 0, 0);

    var dataUrl = canvas.toDataURL();
    var dataUrlAdjusted = dataUrl.replace('data:image/png;base64,', '');

    var builder = new WebKitBlobBuilder();
    builder.append(Base64.decode(dataUrlAdjusted).buffer);

    function complete(resp, xhr) {
      chrome.pageAction.hide(tab.id);
      if (!(xhr.status >= 200 && xhr.status <= 299)) {
        alert('Error: Response status = ' + xhr.status +
              ', response body = "' + xhr.responseText + '"');
      }
    }  // end complete

    OAUTH.authorize(function() {
      OAUTH.sendSignedRequest(
        'http://picasaweb.google.com/data/feed/api/' +
        'user/default/albumid/' + albumId,
        complete,
        {
          method: 'POST',
          headers: {
            'Content-Type': 'multipart/related; boundary=END_OF_PART',
            'MIME-version': '1.0'
          },
          parameters: {
            alt: 'json'
          },
          body: constructContentBody_('title.jpg', 'photo',
                                      builder.getBlob('image/png'),
                                      'image/jpeg', 'lolz')
        }
      );
    });
  }  // end onload

  img.src = data.srcUrl;
}

function constructAtomXml_(docTitle, docType, docSummary) {
  var atom = ['<entry xmlns="http://www.w3.org/2005/Atom">',
              '<title>', docTitle, '</title>',
              '<summary>', docSummary, '</summary>',
              '<category scheme="http://schemas.google.com/g/2005#kind"', 
              ' term="http://schemas.google.com/docs/2007#', docType, '"/>',
              '</entry>'].join('');
  return atom;
};


function constructContentBody_(title, docType, body, contentType, summary) {
  var body_ = ['--END_OF_PART\r\n',
              'Content-Type: application/atom+xml;\r\n\r\n',
              constructAtomXml_(title, docType, summary), '\r\n',
              '--END_OF_PART\r\n',
              'Content-Type: ', contentType, '\r\n\r\n',
              eval(body), '\r\n',
              '--END_OF_PART--\r\n'].join('');
  return body_;
};