Je dois enregistrer une image dans Drupal, via le service/fichier Drupal. Pour ce que je comprends, je dois décoder le fichier en base64 et l’envoyer en tant que charge utile pour le service/fichier. Comment puis-je arriver à encoder le afin de le faire ???? Je veux le faire en javascript.
Je suis l'auteur de angular-base64-upload comme mentionné par @GrimurD. Cette directive fonctionne parfaitement pour ce scénario. Il analyse l'image (ou tout autre type de fichier) en encodage en base64 et attache les informations sur le fichier à un modèle de votre portée.
Exemple d'utilisation:
<input type='file' ng-model='yourModel' base-sixty-four-input>
Une fois que vous avez sélectionné un fichier, yourModel
aura la valeur suivante:
{
"filetype": "text/plain",
"filename": "textfile.txt",
"base64": "/asdjfo4sa]f57as]fd42sdf354asdf2as35fd4"
}
Il contient également un exemple de code permettant de décoder le fichier base64 de votre serveur, à l'aide de PHP ou de Ruby.
Je sais que c'est assez vieux, mais je suis venu ici pour une solution.
Finalement, j'ai découvert que (si vous ne voulez pas utiliser de bibliothèques externes), charger une image en base 64 est aussi simple que d'utiliser javascript FileReader.readAsDataURL ()
Espérons que mon code final aidera les débutants comme moi. Il comporte:
input type='file'
(inspiré par cette réponse )input type='file'
(inspiré par cette réponse )C'est aussi sur codepen
angular.module('starter', [])
.controller('Ctrl', function($scope) {
$scope.data = {}; //init variable
$scope.click = function() { //default function, to be override if browser supports input type='file'
$scope.data.alert = "Your browser doesn't support HTML5 input type='File'"
}
var fileSelect = document.createElement('input'); //input it's not displayed in html, I want to trigger it form other elements
fileSelect.type = 'file';
if (fileSelect.disabled) { //check if browser support input type='file' and stop execution of controller
return;
}
$scope.click = function() { //activate function to begin input file on click
fileSelect.click();
}
fileSelect.onchange = function() { //set callback to action after choosing file
var f = fileSelect.files[0],
r = new FileReader();
r.onloadend = function(e) { //callback after files finish loading
$scope.data.b64 = e.target.result;
$scope.$apply();
console.log($scope.data.b64.replace(/^data:image\/(png|jpg);base64,/, "")); //replace regex if you want to rip off the base 64 "header"
//here you can send data over your server as desired
}
r.readAsDataURL(f); //once defined all callbacks, begin reading the file
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.20/angular.min.js"></script>
<body ng-app='starter' ng-controller='Ctrl'>
<button ng-click='click()'>click to select and get base64</button>
<br>BASE 64 data:
<br>
<span style='color: red'>{{data.alert}}</span>
<div style='Word-wrap:break-Word'>
{{data.b64}}
</div>
</body>
Je vous recommanderais d'utiliser https://github.com/ninjatronic/angular-base64 .
Après avoir suivi les instructions d'utilisation de cette bibliothèque, vous pouvez simplement appeler:
var imageData=$base64.encode(image);
N'oubliez pas d'injecter dans votre module:
.module('myApp', ['base64'])
Vous n'avez pas besoin d'AngularJs pour cela. Il y a un fil ici expliquant comment faire en utilisant Javascript et canvas: Comment convertir une image en chaîne base64 en utilisant javascript
J'avais le même problème et j'ai rencontré ce dépôt sur github . Essayé et cela a fonctionné parfaitement.
j'ai trouvé des sites Web, un navigateur comme chrome, c.-à-d .10..peut être compatible avec cela .__ https://developer.mozilla.org/en-US/docs/Web/API/FileReader?redirectlocale=en-US&redirectslug= DOM% 2FFileReader }