Загрузка файла xhr html на imgurl дает неверный запрос

Я хочу загрузить изображение в imgur, используя их API; с использованием javascript (node.js). Я всегда получаю в ответ:

{"data": {"error": "Формат изображения не поддерживается, или изображение повреждено.", "request": "/ 3 / upload", "method": "POST"}, "success": false, " status ": 400}

Вот код, который я написал:

ImgUrlHelper = 
{
InitUploadValidateFile :function(element)
{
     var file = element.value;
     if(file === "")
        return;

     if(file != '')
     { 
         var valid_extensions = /(.jpg|.jpeg|.gif|.png)$/i;   
          if(valid_extensions.test(file))
          {
                console.log("ok");
                this.Upload(file);
          }
          else
                console.log("notok");
     }
     else
        console.log("notok");
},           

Upload: function(file) {

    var fd = new FormData(); 
    fd.append("image", file); 
    var xhr = new XMLHttpRequest(); 

    xhr.open("POST", "https://api.imgur.com/3/upload", true); 
    xhr.onload = this.OnLoad;
    xhr.onerror = this.OnNetworkError;
    xhr.onreadystatechange = this.OnReadyStateChange;
    xhr.onprogress= this.OnProgress;

    xhr.setRequestHeader('Authorization', 'Client-ID xxxxxxxxxxxx');
    xhr.send(fd);
},

OnReadyStateChange:function(xhr){
    if(xhr.readyState == 4 && xhr.status == 200)
    {
        var link = JSON.parse(xhr.responseText).data.link;
        console.log(link);    
    }
    if(xhr.status != 200)
    {
        console.log(xhr.status);


        //log error
    }
},

OnNetworkError:function(xhr)
{
    //log error
    console.log("network error while uploading.");
    console.log(xhr);
},

OnProgress : function(e)
{
    if (e.lengthComputable) {
      var percentComplete = (e.loaded / e.total) * 100;
      console.log(percentComplete + '% uploaded');
    }
},

OnLoad :  function(res) {

}
}

Я вызываю это, используя событие onchange для input type = "file":

onchange="ImgUrlHelper.InitUploadValidateFile(this)"

Я предполагаю, что есть проблема с чтением файла, который я выбрал с помощью элемента управления загрузкой файлов, здесь:

fd.append("image", file); 

В этот момент файл содержит строку: «C: \ fakepath \ img.jpg». Может быть, мне действительно нужно кодировать изображение?


person Amc_rtty    schedule 30.08.2014    source источник


Ответы (1)


Вы должны загрузить объект File, а не строку.

Измените var file = element.value; на var file = element.files[0];:

// assuming that element is an <input type=file>
InitUploadValidateFile: function(element) {
    var file = element.files[0];
    if (!file)
        return;

    var valid_extensions = /(\.jpg|\.jpeg|\.gif|\.png)$/i;
    if (valid_extensions.test(file.name)) {
        console.log("ok");
        this.Upload(file);
    } else {
        console.log("notok");
    }
},
person Rob W    schedule 30.08.2014