js.writeFile没有正确编写Blob(js.writeFile not writing Blob correctly)
我有一个Angular服务,具有写文件的功能。 该功能可以在Ionic或Electron平台上运行。 对于Ionic,它使用$ cordovaFile进行文件操作,而对于Electron,它使用节点fs库。
功能如下:
writeFile(filename: string, dirname: string, data: string | Blob, replace?: boolean): ngCordova.IFilePromise<ProgressEvent> { if (this.isElectron) { let promiseObj = this.$q.defer(); if (replace) { try { fs.unlinkSync('./' + dirname + '/' + filename); } catch (err) { //err } } fs.writeFile('./' + dirname + '/' + filename, data, 'binary', () => { promiseObj.resolve(true); }); return promiseObj.promise; } else { return this.$cordovaFile.writeFile(cordova.file.dataDirectory + dirname, filename, data, replace); } };
使用Ionic平台时,该功能正常,下载的文件被正确写出。 但是,当使用Electron平台时,所有下载的文件都包含字符串
[object Blob]
。使用fs将Blob写入文件的正确方法是什么?
更多信息
数据最初在JSON消息中作为base64下载,但我们随后使用它
let fileBlob = this.stringUtilityService.b64ToBlob(dataObj.Data[i].FileContents, 'image/png'); this.fileSystemService.writeFile(dataObj.Data[i].FileName, 'icons', fileBlob);
额外的信息
这是b64ToBlob()函数,虽然据我所知,这个函数工作正常并正确返回一个blob,Ionic应用程序正确保存并可以显示。
b64ToBlob(b64Data: string, contentType: string): any { let sliceSize = 512; let byteCharacters = atob(b64Data); let byteArrays = []; for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { let slice = byteCharacters.slice(offset, offset + sliceSize); let byteNumbers = new Array(slice.length); for (let i = 0; i < slice.length; i++) { byteNumbers[i] = slice.charCodeAt(i); } let byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } let blob = new Blob(byteArrays, { type: contentType }); return blob; }
I have an Angular service with a function for writing files away. The function can work on either an Ionic or Electron platform. For Ionic, it uses $cordovaFile for file actions and for Electron it uses the node fs library.
The function is as follows:
writeFile(filename: string, dirname: string, data: string | Blob, replace?: boolean): ngCordova.IFilePromise<ProgressEvent> { if (this.isElectron) { let promiseObj = this.$q.defer(); if (replace) { try { fs.unlinkSync('./' + dirname + '/' + filename); } catch (err) { //err } } fs.writeFile('./' + dirname + '/' + filename, data, 'binary', () => { promiseObj.resolve(true); }); return promiseObj.promise; } else { return this.$cordovaFile.writeFile(cordova.file.dataDirectory + dirname, filename, data, replace); } };
When the Ionic platform is used, the function works fine and the downloaded files are written away correctly. However, when the Electron platform is used, all the downloaded files contain is the string
[object Blob]
.What is the correct way to write Blobs to files using fs?
MORE INFO
The data originally comes down as base64 in a JSON message but we then do this with it
let fileBlob = this.stringUtilityService.b64ToBlob(dataObj.Data[i].FileContents, 'image/png'); this.fileSystemService.writeFile(dataObj.Data[i].FileName, 'icons', fileBlob);
EXTRA MORE INFO
Here is the b64ToBlob() function, although as far as i can tell this function works fine and correctly returns a blob which the Ionic app correctly saves away and can display.
b64ToBlob(b64Data: string, contentType: string): any { let sliceSize = 512; let byteCharacters = atob(b64Data); let byteArrays = []; for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { let slice = byteCharacters.slice(offset, offset + sliceSize); let byteNumbers = new Array(slice.length); for (let i = 0; i < slice.length; i++) { byteNumbers[i] = slice.charCodeAt(i); } let byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } let blob = new Blob(byteArrays, { type: contentType }); return blob; }
原文:https://stackoverflow.com/questions/41808702
最满意答案
这是使用
pprint
漂亮打印的data
:{'service_group_stat': {'cur_conns': 71, 'cur_reqs': 0, 'member_stat_list': [{'cur_conns': 11, 'cur_reqs': 0, 'port': 81, 'req_bytes': 447460215, 'req_pkts': 3134918, 'resp_bytes': 10134966691, 'resp_pkts': 7834233, 'server': 'WWW0006', 'status': 1, 'tot_conns': 52311, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 5, 'cur_reqs': 0, 'port': 81, 'req_bytes': 548725475, 'req_pkts': 3870142, 'resp_bytes': 12396718148, 'resp_pkts': 9572363, 'server': 'WWW0005', 'status': 1, 'tot_conns': 61464, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 15, 'cur_reqs': 0, 'port': 81, 'req_bytes': 711362272, 'req_pkts': 5051483, 'resp_bytes': 15868605964, 'resp_pkts': 12282023, 'server': 'WWW0004', 'status': 1, 'tot_conns': 80898, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 23, 'cur_reqs': 0, 'port': 81, 'req_bytes': 92624447982, 'req_pkts': 575717964, 'resp_bytes': 1832290858664, 'resp_pkts': 1417192127, 'server': 'WWW0003', 'status': 1, 'tot_conns': 7265009, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 14, 'cur_reqs': 0, 'port': 81, 'req_bytes': 97240370978, 'req_pkts': 634692796, 'resp_bytes': 1909851841929, 'resp_pkts': 1479318756, 'server': 'WWW0002', 'status': 1, 'tot_conns': 7130096, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 3, 'cur_reqs': 0, 'port': 81, 'req_bytes': 93596613191, 'req_pkts': 586137971, 'resp_bytes': 1839297678302, 'resp_pkts': 1422848182, 'server': 'WWW0001', 'status': 1, 'tot_conns': 7172117, 'total_reqs': 0, 'total_reqs_succ': 0}], 'name': 'SG_ACCOUNT.BUSINESS.COM_443', 'protocol': 2, 'req_bytes': 285168980113, 'req_pkts': 1808605274, 'resp_bytes': 5619840669698, 'resp_pkts': 4349047684, 'status': 3, 'tot_conns': 21761895, 'total_reqs': 0, 'total_reqs_succ': 0}}
使用此信息,我们现在可以处理它。 对于
member_stat_list
每个服务器,我们可以按您所说的格式打印数据:for server in data["service_group_stat"][["member_stat_list"]: print("Server:".ljust(20," ")+server["server"].ljust(32," ")+"Server Connections:".ljust(24," ")+str(server["cur_conns"]))
Here is
data
pretty-printed usingpprint
:{'service_group_stat': {'cur_conns': 71, 'cur_reqs': 0, 'member_stat_list': [{'cur_conns': 11, 'cur_reqs': 0, 'port': 81, 'req_bytes': 447460215, 'req_pkts': 3134918, 'resp_bytes': 10134966691, 'resp_pkts': 7834233, 'server': 'WWW0006', 'status': 1, 'tot_conns': 52311, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 5, 'cur_reqs': 0, 'port': 81, 'req_bytes': 548725475, 'req_pkts': 3870142, 'resp_bytes': 12396718148, 'resp_pkts': 9572363, 'server': 'WWW0005', 'status': 1, 'tot_conns': 61464, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 15, 'cur_reqs': 0, 'port': 81, 'req_bytes': 711362272, 'req_pkts': 5051483, 'resp_bytes': 15868605964, 'resp_pkts': 12282023, 'server': 'WWW0004', 'status': 1, 'tot_conns': 80898, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 23, 'cur_reqs': 0, 'port': 81, 'req_bytes': 92624447982, 'req_pkts': 575717964, 'resp_bytes': 1832290858664, 'resp_pkts': 1417192127, 'server': 'WWW0003', 'status': 1, 'tot_conns': 7265009, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 14, 'cur_reqs': 0, 'port': 81, 'req_bytes': 97240370978, 'req_pkts': 634692796, 'resp_bytes': 1909851841929, 'resp_pkts': 1479318756, 'server': 'WWW0002', 'status': 1, 'tot_conns': 7130096, 'total_reqs': 0, 'total_reqs_succ': 0}, {'cur_conns': 3, 'cur_reqs': 0, 'port': 81, 'req_bytes': 93596613191, 'req_pkts': 586137971, 'resp_bytes': 1839297678302, 'resp_pkts': 1422848182, 'server': 'WWW0001', 'status': 1, 'tot_conns': 7172117, 'total_reqs': 0, 'total_reqs_succ': 0}], 'name': 'SG_ACCOUNT.BUSINESS.COM_443', 'protocol': 2, 'req_bytes': 285168980113, 'req_pkts': 1808605274, 'resp_bytes': 5619840669698, 'resp_pkts': 4349047684, 'status': 3, 'tot_conns': 21761895, 'total_reqs': 0, 'total_reqs_succ': 0}}
Using this info, we can now process it. For each server in
member_stat_list
, we can print the data in the format you said like this:for server in data["service_group_stat"][["member_stat_list"]: print("Server:".ljust(20," ")+server["server"].ljust(32," ")+"Server Connections:".ljust(24," ")+str(server["cur_conns"]))
相关问答
更多-
为什么不遵循代码? line = "PRO CCC 4629.00" row = line.split() f = float(row[2]) myDict = {row[0]:{row[1]:f}} print(myDict) 它输出。 {'PRO': {'CCC': 4629.0}} 通过你的代码 fh = open("textfile_w_header","r") def codon_preference_table_with_AA(fh): header = fh.readline() ...
-
在Julia中,对字典的迭代是对键/值对的迭代,而不是对值的迭代(或迭代遍历键,如在Python中): julia> for x in d println(x); println(typeof(x)) end (2,["b"=>3.12]) (Int64,Dict{ASCIIString,Float64}) (1,["a"=>1.1]) (Int64,Dict{ASCIIString,Float64}) 所以这就是你的地图得到的原因(Int64,Dict{ASCIIString,Float64}) typ ...
-
partial = defaultdict(lambda: defaultdict(list)) partial = defaultdict(lambda: defaultdict(list))
-
您是否需要在一次调用create_document()函数时创建所有数据,还是可以进行多次调用? 如果你可以做第二个,我会写这样的东西: documents = [ {dict1}, {dict2}, {dict3}, ...] for document in documents: my_document = my_database.create_document(document) # Do some more processing. 这将为列表中的每个文档创建一个文档。 跟进thiss ...
-
使用多个dicts和列表从dict中提取数据的最佳方法?(Best way to extract data from dict with multiple dicts and lists?)[2024-03-24]
这是使用pprint漂亮打印的data : {'service_group_stat': {'cur_conns': 71, 'cur_reqs': 0, 'member_stat_list': [{'cur_conns': 11, 'cur_reqs': 0, ... -
尝试这个: def parse_phrase(phrase): tokens = phrase.split(' ') # or wathever the way you want to tokenize phrase return {w: phrase.index(w) for w in tokens} with open('FR_test.csv', encoding='utf-8') as csvfile: reader = csv.reader(csvfile, delim ...
-
让l成为你的词典列表 l = [ {"a": 10, "type": "square"}, {"type": "square", "b":11}, {"type": "square", "c": 12}, {"d": 13, "type": "square"}, {"type": "square", "e": 14}, {"a": 15, "type": "circle"}, {"type": "circle", "b": 16}, {"type": "circle", "c": 17}, ...
-
CSV格式的Dicts列表(List of Dicts in CSV)[2023-01-02]
评估文件中的每一行并进行一些字典工作可以获得所需的结果: with open(filename) as fobj: next(fobj) # skip first line with word `results` data = [eval(line) for line in fobj if line.strip()] res = [] for entry in data: d = entry[0].copy() for x in entry[1:]: d.u ... -
Python - 从一个列表中比较两个dict和return dicts列表(Python - Compare two lists of dict and return dicts from one list)[2022-03-15]
一个简单的O(n ^ 2)解决方案: a = [dict1, dict2, dict3] b = [dict1, dict2, dict4, dict5, dict6] c = dicts_from_a_not_in_b = [x for x in a if x not in b] d = dicts_from_b_not_in_a = [x for x in b if x not in a] A simple O(n^2) solution: a = [dict1, dict2, dict3] b ... -
如果要提供要复制到新词典中的正键列表: import csv with open('data.csv', 'rb') as csv_file: data = list(csv.DictReader(csv_file)) keys = ['Name', 'Location'] new_data = [dict((k, d[k]) for k in keys) for d in data] print new_data If you want to give a positive list of ...