2017-08-30 3 views
0

J'ai une fonction, qui télécharge des fichiers à l'élément de la liste. Tout fonctionne pour .png, mais quand je suis en train de télécharger .pdf j'ai erreur net::ERR_CONNECTION_RESETSharepoint AddIn télécharger .PDF via SP REST API

écran d'objet d'erreur:

error

Mon code:

function uploadFile(listName, itemId, fileName, file) { 
    uploadFileSP(listName, itemId, fileName, file) 
    .then(function (files) { 
     //success 
    }, function (sender, args) { 
     alert('error: ' + args.get_message()); 
    }); 
} 

function getFileBuffer(file) { 
    var deferred = $.Deferred(); 
    var reader = new FileReader(); 
     reader.onload = function (e) { 
     deferred.resolve(e.target.result); 
    } 
    reader.onerror = function (e) { 
     deferred.reject(e.target.error); 
    } 
    reader.readAsArrayBuffer(file); 
    return deferred.promise(); 
} 

function uploadFileSP(listName, id, fileName, file) { 
    var deferred = $.Deferred(); 
    getFileBuffer(file) 
    .then(function (buffer) { 
     var bytes = new Uint8Array(buffer); 
     var content = new SP.Base64EncodedByteArray(); 
     var binary = ''; 
     for (var b = 0; b < bytes.length; b++) { 
      binary += String.fromCharCode(bytes[b]); 
     } 
     console.log(binary); 
     executor.executeAsync({ 
      url: appweburl + "/_api/web/lists/getbytitle('" + listName + "')/items(" + id + ")/AttachmentFiles/add(FileName='" + file.name + "')", 
      method: "POST", 
      binaryStringRequestBody: true, 
      body: binary, 
      success: function (data) { alert('Pomyślnie dodano fakturę!'); window.location.replace("http://sharepoint-dev.ampliapps.com/FakturyBPNT-SharePoint-Hosted/Lists/Faktury/AllItems.aspx");}, 
      error: function (err) { alert('Wystąpił błąd podczas wprowadzania faktury.'); console.log(err); }, 
      state: "Update" 
     }) 
    }, function (error) { deferred.reject(error); }); 
    return deferred.promise(); 
} 

Comme Je l'ai dit plus tôt, cela fonctionne pour .png par exemple.

+0

ce qui est dans le tampon et le contenu? –

+0

fonctionne quand j'ai ajouté l'en-tête content-length - mais je ne peux pas utiliser cet en-tête dans la plupart des navigateurs. (vérifié dans firefox) –

+0

ok bien, essayez aussi d'ajouter contentType –

Répondre

0

C'est ce que vous avez besoin

function uploadDocument(contents, targetPath, successHandler, failedHandler) { 

var fileName = getFilenameFromUrl(targetPath); 
var fileNameEvidence = fileName; 
var folderName = getPathFromUrl(targetPath); 
var hostWebUrl = ''; 
var appWebUrl = ''; 

hostWebUrl = decodeURIComponent(getQueryStringParameter('SPHostUrl')); 
appWebUrl = decodeURIComponent(getQueryStringParameter('SPAppWebUrl')); 

$.getScript(hostWebUrl + "/_layouts/15/SP.RequestExecutor.js", function() { 
    console.log("into upload Api Document"); 
    var byteArray = new Uint8Array(atob(contents).split("").map(function (c) { 
     return c.charCodeAt(0); 
    })); 
    var fileData = ''; 

    for (var i = 0; i < byteArray.byteLength; i++) { 
     fileData += String.fromCharCode(byteArray[i]); 
    } 
    var reqDocExecutor = new SP.RequestExecutor(appWebUrl); 

    var _url = ''; 
    var contentType = "application/pdf;odata=verbose"; 

    var dotLocation = fileName.lastIndexOf('.'); 
    var extensionFile = fileName.substr(dotLocation); 

    var info; 
    _url = String.format("{0}/_api/sp.appcontextsite(@target)/web/GetFolderByServerRelativeUrl('{1}')/files" + "/add(overwrite=true, url='{2}')[email protected]='{3}'", appWebUrl, folderName, fileName, hostWebUrl); 
    info = { 
     url: _url, 
     method: "POST", 
     headers: { 
      "Accept": "application/pdf; odata=verbose", 
      "X-RequestDigest": $("#__REQUESTDIGEST").val() 
     }, 
     contentType: contentType, 
     processData: false, 
     binaryStringRequestBody: true, 
     body: fileData, 
     success: function (x, y, z) { 
      successHandler(); 
     }, 
     error: function (x, y, z) { 
      console.log('failed to upload document'); 
      failedHandler(); 

     } 
    }; 
    reqDocExecutor.executeAsync(info); 
}); 

} 
+0

Non, l'ajout d'en-tête n'a pas aidé. –

+0

laissez-moi ajouter le code complet –

+0

vous devrez peut-être modifier les URL, mais ce code fonctionne bien –