2012-04-25 23 views
8

Ich versuche, eine Datei von PhoneGap auf einen Server mit der FileTransfer method hochladen. Ich benötige HTTP Basic Auth für diesen Upload aktiviert werden.PhoneGap FileTransfer mit HTTP-Basisauthentifizierung

Hier ist der entsprechende Code:

var options = new FileUploadOptions({ 
     fileKey: "file", 
     params: { 
      id: my_id, 
      headers: { 'Authorization': _make_authstr() } 
     } 
    }); 
    var ft = new FileTransfer(); 
    ft.upload(image, 'http://locahost:8000/api/upload', success, error, options); 

Looking over the PhoneGap source code es scheint, dass ich, indem "Header" der Autorisierungsheader in der "params" -Liste angeben kann, wie ich oben gemacht habe:

 JSONObject headers = params.getJSONObject("headers"); 
     for (Iterator iter = headers.keys(); iter.hasNext();) 
     { 
     String headerKey = iter.next().toString(); 
     conn.setRequestProperty(headerKey, headers.getString(headerKey)); 
     } 

Dies scheint jedoch nicht wirklich den Header hinzuzufügen.

Also: gibt es eine Möglichkeit, HTTP Basic Auth mit PhoneGap FileTransfer zu tun, für iPhone und Android?

+0

Für alle fragen, ist diese Methode oben aufgeführten funktioniert für mich. Sie müssen nur hinzufügen: 'params.headers = {Berechtigung: 'Basic' + Kredits}; options.params = params; ' – gabaum10

+0

headers müssen zu options.headers gehen, die nicht zu options.params .____ hinzugefügt wurden – Adam

Antwort

9

können Sie benutzerdefinierte Header hinzufügen, indem sie die Optionen Hinzufügen anstatt die params wie so:

authHeaderValue = function(username, password) { 
    var tok = username + ':' + password; 
    var hash = btoa(tok); 
    return "Basic " + hash; 
}; 

options.headers = {'Authorization': authHeaderValue('Bob', '1234') }; 
+0

FYI, ich habe Probleme damit in iOS (Stand 14.01.13). Funktioniert gut in Android und BB ... – gabaum10

+0

Welche Version von Phonegap verwenden Sie? Ich hatte Erfolg auf iOS mit 2.3.0 – Ryan

+0

2.2.0 ... das ist interessant, vielleicht sollte ich versuchen, ein Upgrade? Hatten Sie Probleme mit 2.2.0? – gabaum10

0

Die richtige Position für den Header-Array ist als unmittelbares Kind von Optionen. Optionen-> Kopfzeilen. Nicht optionen-> params-> headers. Hier ein Beispiel:

//************************************************************** 
//Variables used below: 
//1 - image_name: contains the actual name of the image file. 
//2 - token: contains authorization token. In my case, JWT. 
//3 - UPLOAD_URL: URL to which the file will be uploaded. 
//4 - image_full_path - Full path for the picture to be uploaded. 
//*************************************************************** 
var options = { 
    fileKey: "file", 
    fileName: 'picture', 
    chunkedMode: false, 
    mimeType: "multipart/form-data", 
    params : {'fileName': image_name} 
}; 

var headers = {'Authorization':token}; 

//Here is the magic! 
options.headers = headers; 
//NOTE: I creaed a separate object for headers to better exemplify what 
// is going on here. Obviously you can simply add the header entry 
// directly to options object above. 

$cordovaFileTransfer.upload(UPLOAD_URL, image_full_path, options).then(
    function(result) { 
     //do whatever with the result here. 
}); 

Hier ist die offizielle Dokumentation: https://github.com/apache/cordova-plugin-file-transfer

0

Sie können sich eine Autorisierungsheader erstellen.

var username = "test", password = "pass";  
var uri = encodeURI("http://"+username + ':' + password +"@localhost:8000/api/upload"); 

See FileTransfer.js für die Umsetzung (Linie 45): Sie können aber auch die Anmeldeinformationen in der URL wie folgt eingeben

function getBasicAuthHeader(urlString) { 
var header = null; 


// This is changed due to MS Windows doesn't support credentials in http uris 
// so we detect them by regexp and strip off from result url 
// Proof: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/a327cf3c-f033-4a54-8b7f-03c56ba3203f/windows-foundation-uri-security-problem 

if (window.btoa) { 
    var credentials = getUrlCredentials(urlString); 
    if (credentials) { 
     var authHeader = "Authorization"; 
     var authHeaderValue = "Basic " + window.btoa(credentials); 

     header = { 
      name : authHeader, 
      value : authHeaderValue 
     }; 
    } 
} 

return header; 
} 
Verwandte Themen