如何使用CAP返回二进制数据?

2020-08-31 00:00发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我正在尝试使用CAP返回一些二进制数据,但似乎框架处理了响应,而我却得到了纯文本:

/**从S3获取对象*/
     异步函数_getObject(req){
         const id = req.data.ID
         const params = {
             值区:vcap_services.objectstore [0] .credentials.bucket,
             密钥:ID
         };

         const data =(await(s3.getObject(params).promise()))。正文
         返回数据
     }
 

有没有一种方法可以定义将要返回的内容?

干杯

皮埃尔

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我正在尝试使用CAP返回一些二进制数据,但似乎框架处理了响应,而我却得到了纯文本:

/**从S3获取对象*/
     异步函数_getObject(req){
         const id = req.data.ID
         const params = {
             值区:vcap_services.objectstore [0] .credentials.bucket,
             密钥:ID
         };

         const data =(await(s3.getObject(params).promise()))。正文
         返回数据
     }
 

有没有一种方法可以定义将要返回的内容?

干杯

皮埃尔

付费偷看设置
发送
7条回答
悻福寶寶
1楼 · 2020-08-31 00:51.采纳回答

你好多米尼克,

请在您的on处理程序中尝试以下return语句:

返回{值:_getObjectStream(req)}

最诚挚的问候,

Vitaly

梦想连接
2楼-- · 2020-08-31 00:47

我正在尝试替换默认的READ处理程序,以从S3获取文件并返回它。 我可以将文件存储在S3中,但是找不到在读取响应中返回文件的方法。

db \ schema.cds:

命名空间媒体;

 实体图片{
   密钥ID:UUID;
   @ Core.MediaType:" image/png"
   内容:大二进制;
 } 

srv \ media-service.cds:

使用'../db/schema'中的媒体作为db;

 服务MediaService {
   实体图片作为db.Pictures上的投影;
 }
 

srv \ media-service.js:

 module.exports = srv => {
         srv.on('UPDATE','Pictures',async req => {
 const id = req.data.ID
 const stream = req.data.content

 const params = {
 值区:vcap_services.objectstore [0] .credentials.bucket,
 密钥:ID,
 身体:溪流
 ContentType:"图片/png"
 };
 s3.upload(params,function(err,data){
 console.log(err,数据)
 })
 })

 srv.on('READ','Pictures',(req,next)=> {
 如果(!req.data.ID){
 返回next()
 }
 _getObject(req)
 })

/**从S3获取对象*/
 异步函数_getObject(req){
 const id = req.data.ID
 const params = {
 值区:vcap_services.objectstore [0] .credentials.bucket,
 密钥:ID
 };

 const data =(await(s3.getObject(params).promise()))。正文
 console.log(数据)
 返回数据
 }
 } 

干杯

Pierre

SKY徐
3楼-- · 2020-08-31 00:40

您好Dominique,

您能否提供更多有关您要实现的目标的信息?

您是否将此功能作为动作/功能的一部分执行,还是作为读取请求的自定义处理程序的一部分? 请与我们分享您的CDS模型的相关部分,以便更好地了解您的用例。

从S3检索的原始数据类型是什么?

最诚挚的问候,

Johannes

天桥码农
4楼-- · 2020-08-31 00:47

Hi Dominique,

处理程序需要返回流( https://使用@ Core.MediaType批注时,请使用nodejs.org/docs/latest-v8.x/api/stream.html )。

伪代码:

 srv.on('READ','Pictures',(req,next)=> {
 如果(!req.data.ID){
 返回next()
 }
 返回_getStream(req)
 })
 

s3模块为您提供什么格式?

最诚挚的问候,

Johannes

SC_Yao
5楼-- · 2020-08-31 00:51

这是一篇博客文章,更详细地解释了如何在CAP中处理媒体以及如何使用Amazon S3: https://blogs.sap.com/2019/11/05/working -with-caps-in-cap-and-amazon-s3 /

hongfeng1314
6楼-- · 2020-08-31 00:33

嗨约翰尼斯,

这是您知道的事情。 我只是尝试了一下,但没有任何改变:

 srv.on('READ','Pictures',(req,next)=> {
   如果(!req.data.ID){
     返回next()
   }
   返回_getObjectStream(req)
 })

 异步函数_getObjectStream(req){
   const id = req.data.ID
   const params = {
     值区:vcap_services.objectstore [0] .credentials.bucket,
     密钥:ID
   };
   返回s3.getObject(params).createReadStream()
 } 

昨天我尝试将流传输到Express请求,但是由于响应被发送两次,所以它不起作用:

 s3.getObject(params).createReadStream()。pipe(req ._。req.res)

干杯

Pierre

绿领巾童鞋
7楼-- · 2020-08-31 00:39

嗨Vitaly,

这有效,谢谢!

我对函数还有另一个问题,是否可以通过函数获取文件? 也许是这样的:

srv \ media-service.cds:

函数getObject(objectKey:String)返回LargeBinary; 

srv \ media-service.js:

 srv.on('getObject',req => {
   const objectKey = req.data.objectKey
   返回{值:_getObjectStream(objectKey)}
 })

但是如何传递参数? 以下内容不起作用("在位置11的'getObject(\" bfc584bd-df15-453e-986c-02d3ccb62141 \")'中找不到预期的uri标记'ODataIdentifier'):

获取https:// .cfapps.eu10.hana.ondemand.com/media/getObject(" bfc584bd-df15-453e-986c-02d3ccb62141")

干杯

Pierre

一周热门 更多>