我正在编写一个从Microsoft Graph请求用户个人资料照片的应用程序。一切都很顺利 - 请求返回200状态代码,显然有很大一部分数据可以返回,一切似乎都很好。但是当我实际尝试将照片插入图像标签时,浏览器拒绝显示它。根据我的理解,Graph将图像作为jpeg二进制文件返回,但我知道/已经搜索过的将图像二进制文件转换为浏览器可显示格式的每个方法都失败了。
使用btoa会产生此错误:
未捕获DOMException:失败 执行' btoa' on' Window':要编码的字符串包含 Latin1范围之外的字符。
//Where photo is the data as a string
let blob = new Blob([photo], { type: "image/jpeg" });
let reader = new FileReader();
reader.addEventListener("load", (e: any) => {
let imgSrc = e.target.result;
$("img").attr("src", imgSrc);
});
reader.readAsDataURL(blob);

let blob = new Blob([photo], { type: "image/jpeg" });
let url = URL.createObjectURL(blob);
$("img").attr("src", url);

$("img").attr("src", "data:image/jpeg;base64," + hexToBase64(photo));

此时我完全没有想法。有人有什么建议吗?
答案 0 :(得分:0)
我创建了一个示例Web应用,供人们使用名为Visual Graph Explorer的Graph API。使用O365凭据登录Web应用程序后,您将看到它开始下拉用户照片。如果您想查看完整的来源,可以在GitHub上查看。
显示用户照片的代码如下所示。我在这里使用angular,但关键是使用func getJSON(url:String) -> NSData {
return NSData(contentsOfURL: NSURL(string: url)!)!
}
方法将响应数据转换为可由浏览器呈现的URL。这非常接近你的第二个例子。
createObjectUrl
function successCallback(response) {
var url = window.URL || window.webkitURL;
var blobUrl = url.createObjectURL(response.data);
$scope.myPhoto = blobUrl;
Cache.save(blobUrl, $scope.personId);
}
我希望这有帮助!