Instantiating Blobs in dartlang - dart
I've been struggling to instantiate Blobs in dartlang as of late, but i worked out how to do it in version 8640
For those interested (I couldn't find an example anywhere on the net)
I did this:
HttpRequest req = new HttpRequest();
FileReader fileReader = new FileReader();
req.open("GET", "http://...", true);
req.responseType="blob";
req.overrideMimeType("image/png");
req.on.load.add( (event) {
if(req.readyState==4) {
Blob blob = req.response; // note NOT req.responseBlob
fileReader.on.load.add( (evt) {
document.query('#myimage').src=evt.target.result;
});
fileReader.readAsDataURL(blob);
}
});
req.send();
I hope this helps somebody :)
If anyone landed here trying to figure out how to call the Blob constructor like I did, you actually need to feed it a list of lists (i.e. a List<List<int>>).
So, if you have a list of integers:
var binary = [1, 2, 3];
You pass it to the Blob constructor thusly:
var blorp = new Blob([binary]);
Calling var blorp = new Blob(binary); will result in a confusing message, claiming that the constructor wants a String.
From the answer embedded in the question above:
HttpRequest req = new HttpRequest();
FileReader fileReader = new FileReader();
req.open("GET", "http://...", true);
req.responseType="blob";
req.overrideMimeType("image/png");
req.on.load.add( (event) {
if(req.readyState==4) {
Blob blob = req.response; // note NOT req.responseBlob
fileReader.on.load.add( (evt) {
document.query('#myimage').src=evt.target.result;
});
fileReader.readAsDataURL(blob);
}
});
req.send();
Related
TauriJS writeBinaryFile cannot freeze array buffer views with elements
I work with TauriJS and try to modify a zip file with jszip and later save it with writeBinaryFile. function saveFile(org_path, new_path, pack_format) { var zip = new JSZip(); // get file var org_file = await window.__TAURI__.fs.readBinaryFile(org_path); await zip.loadAsync(org_file); // edit file var pack_json = await zip.file("pack.json").async("string"); pack_json = JSON.parse(pack_json); pack_json.pack.pack_format = pack_format; zip.file("pack.json", JSON.stringify(pack_json)); // save file var array_zip = await zip.generateAsync({type:"uint8array"}); await window.__TAURI__.fs.writeBinaryFile(new_path, array_zip); } This is the code I currently have. The problem is that it gives the error Uncaught TypeError: Cannot freeze array buffer views with elements I wasn't able to find a solution to this error, is it somehow possible to bring the zip file in the right format to save it?
I found a way to fix the problem on this page: https://qdmana.com/2022/144/202205241127535226.html This is my adjusted code: function saveFile(org_path, new_path, pack_format) { var zip = new JSZip(); // get file var org_file = await window.__TAURI__.fs.readBinaryFile(org_path); await zip.loadAsync(org_file); // edit file var pack_json = await zip.file("pack.json").async("string"); pack_json = JSON.parse(pack_json); pack_json.pack.pack_format = pack_format; zip.file("pack.json", JSON.stringify(pack_json)); // save file zip.generateAsync({ type: 'blob' }).then((content) => { var file = new FileReader(); file.readAsArrayBuffer(content); file.onload = function (e) { var fileU8A = new Uint8Array(e.target.result); window.__TAURI__.fs.writeBinaryFile({ contents: fileU8A, path: new_path + ".zip" }); }; }); }
PDFTron webviewer - how to save the whole redacted pdf to server using ASP.net MVC Core
I am currently a developing an application in MVC Core that is using a PDFTron webviewer. Is there anyway to save the edited pdf edited with pdftron webviewer to the server? There is a feature of pdftron that saves annotations to the server, but I need to save the whole pdf with the edits to the server. WebViewer({ path: '/lib/WebViewer', initialDoc: '/StaticResource/Music.pdf', fullAPI: !0, enableRedaction: !0 }, document.getElementById('viewer')).then( function(t) { samplesSetup(t); var n = t.docViewer; n.on('documentLoaded', function() { document.getElementById('apply-redactions').onclick = function() { t.showWarningMessage({ title: 'Apply redaction?', message: 'This action will permanently remove all items selected for redaction. It cannot be undone.', onConfirm: function () { alert( ); t.docViewer.getAnnotationManager().applyRedactions() debugger var options = { xfdfString: n.getAnnotationManager().exportAnnotations() }; var doc = n.getDocument(); const data = doc.getFileData(options); const arr = new Uint8Array(data); const blob = new Blob([arr], { type: 'application/pdf' }); const data = new FormData(); data.append('mydoc.pdf', blob, 'mydoc.pdf'); // depending on the server, 'FormData' might not be required and can just send the Blob directly const req = new XMLHttpRequest(); req.open("POST", '/DocumentRedaction/SaveFileOnServer', true); req.onload = function (oEvent) { // Uploaded. }; req.send(data); return Promise.resolve(); }, }); }; }), t.setToolbarGroup('toolbarGroup-Edit'), t.setToolMode('AnnotationCreateRedaction'); } ); When i send the request to the Controller i am not getting the file it is coming null [HttpPost] public IActionResult SaveFileOnServer(IFormFile file) { return Json(new { Result="ok"}); } Can any one suggest me where i am going wrong Thanks in adavance
For JavaScript async function, you need to wait for it completes before doing other things. For example, AnnotationManager#applyRedactions() returns a Promise, the same for AnnotationManager#exportAnnotations() and Document#getFileData(). For JS async functions, you can take a look at: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Promises https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await So here you may want to use await to wait for the Promise completes.
How to make ol.source.ImageWMS send POST request
In our project, we're using OpenLayers-3's ol.source.ImageWMS to show image provided by Mapserver WMS. Since we're using Mapserver runtime substitution, our request can become quite long, which could cause a problem for a GET request. Is there a way to make ol.source.ImageWMS send POST request?
I answer this just for the reference based on this Openlayers dev thread, hopefully it will help someone in the future!. I needed to pass a very long CQL request to a Geoserver wms, and GET was limited in size, so I used POST like the following: var POSTWMSLayer = new ol.layer.Image({ source: new ol.source.ImageWMS({ url: 'https://test.server.com/geoserver/wms', params: { 'LAYERS': 'firstworkspace:states', 'CQL_FILTER':'gid IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159) }, serverType: 'geoserver', imageLoadFunction: function (image, src) { var img = image.getImage(); if (typeof window.btoa === 'function') { var urlArray = src.split("?"); var url = urlArray[0]; var params = urlArray[1]; var xhr = new XMLHttpRequest(); xhr.onload = function (e) { if (this.status === 200) { var uInt8Array = new Uint8Array(this.response); var i = uInt8Array.length; var binaryString = new Array(i); while (i--) { binaryString[i] = String.fromCharCode(uInt8Array[i]); } var data = binaryString.join(''); var type = xhr.getResponseHeader('content-type'); if (type.indexOf('image') === 0) { img.src = 'data:' + type + ';base64,' + window.btoa(data); } } }; xhr.open('POST', url, true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.responseType = 'arraybuffer'; xhr.send(params); } else { img.src = src; } } }) });
Actually the httprequest is the problem, use Httprequest Post method instead of get method in ol.source.ImageWMS? Get request can not pass long string parameters. For big parameters we need to pass request with post method. Now the bottleneck is that the post method is not supported in openlayers 3 whereas in old version it had support for post method. Note: This is old OpenLayers code var query = new OpenLayers.Layer.WMS.Post("My Layer", 'http://192.168.6.51:8090/geoserver/VP/wms', { LAYERS : 'Namespace:LayerName', sld_body : strSld_body, format : 'image/jpeg', transparent : 'true' }, { unsupportedBrowsers: [], isBaseLayer: false, yx : {'EPSG:4326' : true} } ); In openlayers 3 there may be a workaround.
Using Dart to Download a PNG File (Binary File) and displaying it not working
I have a rest API which I am calling to retrieve a PNG image to display on my page. My Code: void getProfilePicture(var pic_id) { request = new HttpRequest(); request.responseType = "blob"; request.onReadyStateChange.listen(onPicture); // Get Basic Auth credentials var authorization = 'Basic '+storage.loginData['password']; // Build JSON Map reqData = new Map(); reqData['id'] = pic_id.toString(); reqData['type'] = 'WEB_SMALL'; // SEND the request to the server. var url = sifted.serverAPI+'/api/v1/pictures/getpicture'; request.open('POST', url); request.withCredentials = false; request.setRequestHeader('Authorization',authorization); request.setRequestHeader('Content-Type','application/json'); request.send(json.stringify(reqData)); } void onPicture(_) { if (request.readyState == HttpRequest.DONE && request.status == 200) { Blob blob = new Blob(request.response); FileReader reader = new FileReader(); reader.onLoad.listen((fe) { ImageElement imgInput = query('#profilepic'); imgInput.src = reader.result; }); reader.readAsDataUrl(blob); } } It does not work and I get these errors in the Dart editor: Exception: type 'Blob' is not a subtype of type 'List' of 'blobParts'. Exception: type 'Blob' is not a subtype of type 'List' of 'blobParts'. Any suggestions on what I am doing wrong? Thank you !
The problem is this line: Blob blob = new Blob(request.response); The Blob constructor expects a List instead of another Blob (which request.response is in your use case): factory Blob(List blobParts, [String type, String endings]) Just delete the line, and directly call reader.readAsDataUrl(request.response), and it should work.
imagemagick in meteorjs (with the help of meteor-router and fibers)
I am unable to use imagemagick in meteorjs. I am working on a small svg->png converter which contains a rest api to provide the converted images. I implemented the rest api with meteor-router. The imagemagick convertion works. But, I am not able to write the result of the convertion into the http response. I tried to fix this by getting rid of the asynchronisity by using fiber. But this still doesn't work. Basically, all request.write calls are ignored after the yield execution. Here is my code: Meteor.Router.add({ '/image/:hash' : function(hash) { var svg = Images.findOne({'hash' : hash}).svg; var request = this.request; var response = this.response; Fiber(function() { var fiber = Fiber.current; response.writeHead(200, {'Content-Type':'image/png'}); var convert = imagemagick.convert(['svg:-', 'png:-']); convert.on('data', function(data) { response.write("doesn't work"); //response.write(data); }); convert.on('end', function() { response.write("doesn't work"); //response.end(); fiber.run({}); }); convert.stdin.write(svg); convert.stdin.end(); response.write("works"); Fiber.yield(); response.write("doesn't work"); }).run(); } }); I am pretty new to meteorjs. Therefore, I might use Fiber completely wrong. Or I should not use fiber at all. Can someone help?
Thanks to the author from meteor-router, I was able to fix the problem. I was using fiber the wrong way. As described at https://github.com/laverdet/node-fibers#futures, it's not recommended to use fiber without an abstraction between your code and the raw API. Fortunately, fiber provides one abstraction called future which can be used for my use case! Here is the working code: var require = __meteor_bootstrap__.require, Future = require('fibers/future'); Meteor.startup(function() { Meteor.Router.add('/image/:hash', function(hash) { var response = this.response; var fut = new Future(); response.writeHead(200, {'Content-Type':'text/plain'}); setTimeout(function(){ response.write("hello hello"); fut.ret(); }, 1); fut.wait(); }); });
I did some more investigation. The issue is orthogonal to imagemagick. E.g.: the following code snippets do not work too in meteor-router: Example 1: Meteor.startup(function() { Meteor.Router.add({ '/image/:hash' : function(hash) var request = this.request; var response = this.response; response.write("outside"); setTimeout(function(){ response.write("inside"); response.end(); }, 1); } }); Example 2: Meteor.startup(function() { Meteor.Router.add({ '/image/:hash' : function(hash) var request = this.request; var response = this.response; response.write("outside"); Fiber(function() { var fiber = Fiber.current; setTimeout(function(){ response.write("inside"); response.end(); }, 1); Fiber.yield(); }).run(); } }); I think it's general issue of meteor-router. Because both examples do work with pure nodejs.