ruby-on-rails - Rails 从二进制数据流下载 zip
问题描述
我有一个数据 API 来从文件系统接收数据。data-API 是一个 nodeJS 服务器。我们的网络服务器是 Rails 服务器。从网络服务器,我将参数发送到我想要下载的文件的 API。然后,data-API 压缩请求文件并将压缩文件作为二进制数据发回。
到目前为止一切正常。现在来到我被卡住的部分。我想将二进制数据作为下载呈现给浏览器。我可以将二进制数据转换为 zip 文件并将其发送到浏览器,或者有另一个巧妙的解决方案将二进制数据显示为下载。
这是我到目前为止所得到的
Rails 网络服务器端:
app/controllers/simulation_controller.rb
def download_multiple
files = JSON.parse(params[:files])
file_list = @simulation.sweep_points.find(params[:sweep_point_id]).file_list
send_data file_list.zip(files: files), filename: 'archive.zip', type: 'application/zip', disposition: 'attachment'
end
app/models/file_list.rb
def zip
uuid = SecureRandom.uuid
simulation = sweep_point.simulation
files = files[:files].join(" ")
url = URI.parse("http://localhost:3003/files/zip/#{simulation.name}/#{uuid}");
req = Net::HTTP::Get.new(url.to_s)
req.add_field("files", files)
res = Net::HTTP.start(url.host, url.port) { |http| http.request(req) }
content = res.body
content.force_encoding("ASCII-8BIT")
end
nodeJS 数据 API 端:
exports.zip_simulation_files = (req, res) => {
const { headers, method, url } = req;
var simulation = req.params.simulation;
var uuid = req.params.uuid;
var files, command;
req.on("error", (err) => {
console.error(err);
});
files = req.headers.files;
command = "cd postprocess/bumblebee-zip " + "run" + simulation + " " + uuid + " " + "'" + files + "'";
execute(command, (data) => {
res.on("error", (err) => {
console.error(err);
});
const zipFilePath = "/home/samuel/test_bumblebee/.zips/run" + simulation + "-files-" + uuid + ".zip"
var zipFile = fs.readFileSync(zipFilePath);
var stats = fs.statSync(zipFilePath);
res.writeHead(200, {
'Content-Type': 'application/zip',
'Content-Disposition': 'attachment; filename="archive.zip"',
'Content-Length': stats.size,
'Content-Transfer-Encoding': 'binary'
});
res.end(zipFile, 'binary');
});
}
到目前为止,我得到的响应是一个似乎是二进制字符串的字符串。以此开始和结束:
"PK\x03\x04\x14\x00\x00\x00\b\x00\xA8\x89\xDBJ\xB1\xB8\xA1\xBF2\x03\x00\x00\xB7F\x00\x006\x00\x1C\x00runZhangD3FINAL /13.0V/annihilation_abs_profile_001.outUT\t\x00\x0 ....... x06\x00\x00\x00\x00\x05\x00\x05\x00l\x02\x00\x00)\x10\x00\x00 \x00\x00"
我研究了不同的解决方案,试图将二进制数据字符串转换为 zip 文件或将流直接呈现给浏览器,但没有任何效果。要么未创建 zip,要么未将二进制文件视为正确数据。
什么是好的解决方案?
解决方案
推荐阅读
- php - WooCommerce 电子邮件模板中的 ACF 自定义字段
- database - 如何使用键从另一个表中插入数据?
- angular - ngClass 最佳实践中的角度参考 id
- java - 双击 jtable 的错误行为
- unit-testing - 如何在单元测试 Nest.js 中测试抛出新的 HttpException
- c# - 如何使用 Visual Studio Code 在 dotnet 构建中包含资源文件
- javascript - 无需完整 HTML 编译的 Webpack + SSI 渲染
- javascript - 如何从 javascript 过滤器函数返回索引(根据值过滤)?
- asp.net-mvc - 参数字典包含参数“departmentId”的空条目
- here-api - 计算路由在相同的两个地方返回不同的数字