应答2-发送文件和其它数据(send_data)

本文介绍了Rails框架中send_data与send_file方法的使用细节,包括如何发送二进制数据和文件内容给客户端,并设置了不同的选项来控制客户端的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们已经看了在“控制器”内提交模板(render)和发送字符串(render_to_string)。应答的第三个部分是发送数据(典型地,但不是必须的,是文件的内容)给客户端。

A、send_data 发送包含二进制数据的字符串给客户端。
send_data(data, options...)
发送一个数据流给客户端。典型地浏览器将结合使用内容类型与部署,两者在选项内设
置,来决定这个用数据做什么。
def sales_graph
png_data = Sales.plot_for(Date.today.month)
send_data(png_data, :type => "image/png", :disposition =>
"inline")
end
选项:
1、:filename 字符串, 在保存数据时,建议浏览器使用缺省的文件名。
2、:type 字符串, 内容类型,缺省为application/octet-stream。
3、:disposition 字符串, 建议浏览器应该使用内联的(选项inline)或者是下载的文
件并保存(缺省选项attachment)。

B、send_file 发送文件的内容给客户端。
send_file(path, options...)
发送指定文件给客户端。方法设置Content-Length,Content-Type,Content-
Disposition,和Content-Transfer-Encodeing 头。
选项:
1、:filename 字符串, 当保存文件时,建议浏览器使用缺省文件名。如果没有设置,
缺省是文件名路径。
2、:type 字符串, 内容类型,缺省应用application/octet-stream。
3、:disposition 字符串,建议浏览器应该使用内联的(选项inline)或者是下载的文件
并保存(缺省选项attachment)。
4、:streaming true 或false ,如果是false, 则整个文件被读入服务器内存并发送
给客户端。否则,文件以:buffer_size 块来读并写给客户端。
You can set additional headers for either send_ method using the headers
attribute in the controller.
def send_secret_file
send_file("/files/secret_list")
headers["Content-Description"] = "Top secret"
end
#include "oled.h" //PB8 I2C1_SCL //PB9 I2C1_SDA //将SCL配置通用开漏输出 void scl_out(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); IIC_SCL_H; } //将SDA配置通用开漏输出 void sda_out(void) { GPIO_InitTypeDef GPIO_InitStruct ; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD ; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_Init(GPIOB,&GPIO_InitStruct); IIC_SDA_H; } //将SDA配置通用输入 void sda_in(void) { GPIO_InitTypeDef GPIO_InitStruct ; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN ; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_Init(GPIOB,&GPIO_InitStruct); } //起始条件 void iic_start(void) { sda_out(); IIC_SCL_H; IIC_SDA_H; IIC_SDA_L; IIC_delay(Tsu_sta); // 起始条件保持时间 } //重复起始条件 void iic_restart(void) { sda_out(); IIC_SCL_H; IIC_SDA_H; IIC_delay(Tsu_sta); //重复起始条件建立时间 IIC_SDA_L; IIC_delay(Thd_sta); //起始条件保持时间 } //停止条件 void iic_stop(void) { sda_out(); IIC_SCL_H; IIC_SDA_L; IIC_delay(Tsu_sto); //停止条件建立时间 IIC_SDA_H; IIC_delay(T_buf); //两次IIC通信总线空闲时间 } //发送单字节函数(接收应答) //参数: u8 data发送数据 //返回值: u8 ack 返回0表示接收到有效应答 u8 iic_send_byte(u8 data) { int i = 0; u8 ack = 0; //发送8位数据 sda_out(); for(i = 7;i >= 0; i--) { IIC_SCL_L; //时钟线拉低,SDA才能改变 //先准备数据,SCL必须为低 if(data & (1<<i)) // 期望发送一位'1' { IIC_SDA_H; } else { IIC_SDA_L; } IIC_delay(T_low); //SCL低电平维持时间,等待数据准备完成 IIC_SCL_H; //时钟线拉高,SDA才能发送数据 IIC_delay(T_high); //SCL高电平维持时间,等待数据发送完成 } IIC_SCL_L; //每次操作后建议将SCL拉低——>避免产生开始/停止条件 //接收1位应答信号 sda_in(); IIC_SCL_L; //发送方准备发送数据 IIC_delay(T_low); IIC_SCL_H; //发送方开始发送数据 if(IIC_SDA) //读取数据 { ack = 1; } else { ack = 0; } IIC_delay(T_high); //等待数据读取完毕 IIC_SCL_L; return ack; } //接收单字节函数(发送应答) //参数: u8 ack 填0表示发送有效应答->通信继续 填1表示发送无效应答->通信结束 //返回值: u8 data 接收的数据 u8 iic_recv_byte(u8 ack) { int i = 0; u8 data = 0; //接收8位数据 sda_in(); for(i = 7;i >= 0; i--) { IIC_SCL_L; //发送方准备发送数据 IIC_delay(T_low); IIC_SCL_H; //发送方开始发送数据 if(IIC_SDA) // 读取数据 { data |= (1<<i); } else { data &=~ (1<<i); } IIC_delay(T_high); //等待数据读取完毕 } IIC_SCL_L; //发送8位数据 sda_out(); IIC_SCL_L; //时钟线拉低,SDA才能改变 //先准备数据,SCL必须为低 if(ack) // 期望发送一位'1' { IIC_SDA_H; } else { IIC_SDA_L; } IIC_delay(T_low); //SCL低电平维持时间,等待数据准备完成 IIC_SCL_H; //时钟线拉高,SDA才能发送数据 IIC_delay(T_high); //SCL高电平维持时间,等待数据发送完成 IIC_SCL_L; //每次操作后建议将SCL拉低——>避免产生开始/停止条件 return data; } u8 oled_send_cmd(u8 cmd) { iic_start(); iic_send_byte(0x78); iic_send_byte(0x00); u8 ack = iic_send_byte(cmd); iic_stop(); return ack; }怎么测试我的iic对不对
05-28
static int8_t SWD_Write( SWD_GPIO_TypeDef *SWD_GPIO, uint8_t header, uint32_t data ) { static uint32_t lsb_bit; //低位优先数据 static uint8_t ack; //ack响应数据 static uint8_t parity; //奇偶校验位 static int8_t i; //for循环次数 uint8_t headerbit = header; //发送8位包头 *SWD_GPIO->SWD_MODE |= SWD_GPIO -> MODE_OUT; //SWD输出模式 //*SWD_GPIO->SWD_LOW = SWD_GPIO->SWD_BIT; for ( i = 0; i < 8; i++ ) { lsb_bit = ( headerbit & 1 ); if( lsb_bit ) { *SWD_GPIO->SWD_HIGH = SWD_GPIO->SWD_BIT; //SWD取1 } else { *SWD_GPIO->SWD_LOW = SWD_GPIO->SWD_BIT; //SWD取0 } //低电平保持 //一次时钟信号 *SWD_GPIO -> SWC_HIGH = SWD_GPIO -> SWC_BIT; NOP_DELAY_2 //高电平保持 *SWD_GPIO -> SWC_LOW = SWD_GPIO -> SWC_BIT; NOP_DELAY_1 //低电平保持 headerbit >>= 1; } NOP_DELAY_2 //切换SWD为输入模式 *SWD_GPIO->SWD_MODE &= SWD_GPIO -> MODE_IN; *SWD_GPIO -> SWC_HIGH = SWD_GPIO -> SWC_BIT; NOP_DELAY_2 //高电平保持 *SWD_GPIO -> SWC_LOW = SWD_GPIO -> SWC_BIT; NOP_DELAY_2 //低电平保持 //ack应答 ack = 0; for( i = 0; i < 3; i++ ) { ack |= Pin7bit( ) << i; //ack第0位 *SWD_GPIO -> SWC_HIGH = SWD_GPIO -> SWC_BIT; NOP_DELAY_2 //高电平保持 *SWD_GPIO -> SWC_LOW = SWD_GPIO -> SWC_BIT; NOP_DELAY_1 //低电平保持 } if ( ( ack != 0x1 ) & ( ack != 0x2 ) ) { //DEBUG("write error\r\n"); } if ( ack == 0x2 ) { /* 错误处理 */ *SWD_GPIO->SWD_MODE |= SWD_GPIO -> MODE_OUT; *SWD_GPIO->SWD_LOW = SWD_GPIO->SWD_BIT; //SWD取0 for ( int8_t i = 0; i < 20; i++ ) { *SWD_GPIO -> SWC_HIGH = SWD_GPIO -> SWC_BIT; NOP_DELAY_2 //高电平保持 *SWD_GPIO -> SWC_LOW = SWD_GPIO -> SWC_BIT; NOP_DELAY_2 //低电平保持 } return SWD_Write( SWD_GPIO, header, data ); }如何将这个递归改成迭代
最新发布
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值