繁体   English   中英

在 JavaScript 中创建 csv 并作为 multipart/form-data 发布

[英]Create csv and post as multipart/form-data in JavaScript

如何在 JavaScript 中创建等效代码?

给定 ['col1', 'col2'] 和 ['val1', 'val2'] OR 'col1,col2\r\nval1,val2\r\n'

我希望能够在不读取/写入磁盘的情况下创建一个 csv 对象,然后发布它。

Python:

from io import StringIO
import csv
import requests

f = StringIO()
w = csv.writer(f)
w.writerow(['col1', 'col2'])
w.writerow(['val1', 'val2'])
input_byte = f.getvalue().encode('UTF-8')

headers = {'Content-Type':"multipart/form-data"}
endpoint = "http://localhost:8085/predict"
files = {'file': ('input.csv', input_byte)}
response = requests.post(endpoint, files=files)

到目前为止,这是我在 JavaScript 中的代码:

let data = [['col1', 'col2'],
            ['val1', 'val2']];
// convert to csv format
let csvContent = data.map(e => e.join(",")).join("\r\n") + "\r\n";
// I believe FormData object is required to send multipart/form-data
// I do not think I am passing my csv data correctly
let body = new FormData();
let buff = Buffer.from(csvContent, "utf-8");
body.append("file", buff, {filename : 'input.csv'});

let response = await fetch("http://localhost:8085/predict",
               {
                  method: 'POST',
                  body: body,
                  headers: {'Content-Type':"multipart/form-data"}
               });

编辑:

我能够发送一个 csv 文件,但必须先将其写入磁盘。 有可能避免吗?

let data = [['col1', 'col2'],
            ['val1', 'val2']];
// convert to csv format
let csvContent = data.map(e => e.join(",")).join("\r\n") + "\r\n";

// save a csv file
let path = './files/' + Date.now() + '.csv';
fs.writeFile(path, csvContent, (err) => {
  if (err) {
    console.error(err);
  }
});

let body = new FormData();
// this works :)
// but how can I create a csv buffer without writing to a disk?
body.append("file", fs.createReadStream(path), {filename : 'input.csv'});
let response = await fetch("http://localhost:8085/predict",
               {
                  method: 'POST',
                  body: body,
               });

我能够使用以下脚本解决我的问题:

const FormData = require('form-data');
const Readable = require('stream').Readable;
const fetch = require("node-fetch");

let data = [['col1', 'col2'],
            ['val1', 'val2']];
// convert to csv format
let csvContent = data.map(e => e.join(",")).join("\r\n") + "\r\n";
const stream = Readable.from(csvContent);

let body = new FormData();
body.append("file", stream, {filename : 'input.csv'});
let response = await fetch("http://localhost:8085/predict",
               {
                  method: 'POST',
                  body: body,
               });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM