2014-10-05 2 views
1

Я пытаюсь создать форму, которая может загружать двоичные данные через octokit.js в github. Например, некоторые pdf или изображения (двоичные blob). Моя проблема в том, что все мои попытки заканчиваются поврежденными данными на стороне github.HTML5 файл api и octokit.js и двоичный файл

Минимальный рабочий пример: http://jsfiddle.net/keddie/7r3f4q77/

var _arrayBufferToBase64 = function (buffer) { 
    var binary = ''; 
    var bytes = new Uint8Array(buffer); 
    var len = bytes.byteLength; 
    for (var i = 0; i < len; i++) { 
    binary += String.fromCharCode(bytes[i]); 
    } 
    return window.btoa(binary); 
}; 

var go = function() { 
var config = { 
    user: $('#user').val(), 
    repo: $('#repo').val(), 
    token: $('#token').val(), 
    handler: document.getElementById('file').files[0] 
}; 

var reader = new FileReader(); 
var github = new Octokit({ 
    token: config.token 
}); 
var repo = github.getRepo(config.user, config.repo); 
var branch = repo.getBranch(); 

reader.onloadend = function (evt) { 
    var files = {}; 
    if (evt.target.readyState == FileReader.DONE) { 

     /* Anothers attempts: 
     files[ 'x1.pdf' ] = { 
      isBase64: true, 
      content: evt.target.result 
     }; 
     files[ 'x2.pdf' ] = { 
      isBase64: true, 
      content: evt.target.result.substring('data:application/octet-stream;base64,'.length) 
     }; 
     */ 
     files['x4.pdf'] = { 
      isBinary: true, 
      isBase64: true, 
      content: _arrayBufferToBase64(evt.target.result) 
     }; 
    } else { 
     console.warn(evt.target.error); 
    } 
    branch.writeMany(files, "API test commit 1").then(function (res) { 
     if (res) { 
      console.log('ok'); 
      $('#result').text('OK'); 
     } else { 
      console.error(res); 
      $('#result').text('Error'); 
     } 
    }); 
}; 
var blob = config.handler.slice(0, config.handler.size); 
//reader.readAsDataURL(blob); 
reader.readAsArrayBuffer(blob); 
}; 

$(document).ready(function() { 
    $('#submit').click(go); 
}); 

И HTML:

<p>User: 
<input type="text" id="user" /> 
</p> 
<p>Repo: 
<input type="text" id="repo" /> 
</p> 
<p>Token: 
<input type="text" id="token" /> 
</p> 
<p>File: 
<input type="file" id="file" /> 
</p> 
<p> 
<button id="submit">Submit</button> 
</p> 
<p id="result"></p> 

Моя вторая проблема заключается в том, чтобы найти имя файла в reader.onloadend обратного вызова (но это небольшая проблема).

актуален этот вопрос: https://github.com/philschatz/octokit.js/issues/44

ответ

Смежные вопросы