应答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
/*---------------------------------------------------------- File Name: main.c Description: 8051单片机通过串口控制LED蜂鸣器 接收字符'F'时LED闪烁,其他字符时蜂鸣器报警 Hardware: P2.0 - LED(低电平驱动) P1.0 - 蜂鸣器(高电平驱动) UART - 波特率9600 @11.0592MHz ----------------------------------------------------------*/ // 头文件包含 #include <reg51.h> // 8051寄存器定义 #include <string.h> // 字符串操作函数 // 硬件引脚定义 sbit LED = P2^0; // LED连接P2.0引脚(0-亮,1-灭) sbit BUZZER = P1^0; // 蜂鸣器连接P1.0引脚(1-响,0-停) // 全局变量声明 bit rx_flag = 0; // 串口接收标志(1-收到数据) char rx_data; // 接收数据存储 /*------------------------------------------------ 函数名称:UART_Init 功能描述:初始化串口通信 参数说明:无 波特率: 9600(使用11.0592MHz晶振) ------------------------------------------------*/ void UART_Init() { TMOD = 0x20; // 定时器1设置为模式2(8位自动重装) TH1 = 0xFD; // 定时器初值(计算得出9600波特率) TL1 = 0xFD; // 与TH1相同(模式2自动重装值) TR1 = 1; // 启动定时器1 SCON = 0x50; // 串口模式1(8位UART),允许接收(REN=1) EA = 1; // 开启总中断 ES = 1; // 开启串口中断 } /*------------------------------------------------ 函数名称:delay_ms 功能描述:粗略毫秒级延时(适用于11.0592MHz) 参数说明:ms - 延时毫秒数 注意: 实际延时误差较大,建议用定时器精确延时 ------------------------------------------------*/ void delay_ms(unsigned int ms) { unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 114; j++); // 经验值循环次数 } /*------------------------------------------------ 函数名称:LED_Blink 功能描述:LED闪烁指定次数 参数说明:times - 闪烁次数(每次含亮灭各500ms) ------------------------------------------------*/ void LED_Blink(unsigned char times) { unsigned char i; for(i = 0; i < times; i++) { LED = 0; // 输出低电平,LED亮 delay_ms(500); // 保持500ms LED = 1; // 输出高电平,LED灭 delay_ms(500); // 保持500ms } } /*------------------------------------------------ 函数名称:Buzzer_Beep 功能描述:蜂鸣器鸣叫指定次数 参数说明:times - 鸣叫次数(每次含响停各500ms) ------------------------------------------------*/ void Buzzer_Beep(unsigned char times) { unsigned char i; for(i = 0; i < times; i++) { BUZZER = 1; // 输出高电平,蜂鸣器响 delay_ms(500); BUZZER = 0; // 输出低电平,蜂鸣器停 delay_ms(500); } } /*------------------------------------------------ 函数名称:UART_SendString 功能描述:通过串口发送字符串 参数说明:str -发送字符串指针 发送机制:轮询TI标志,阻塞式发送 ------------------------------------------------*/ void UART_SendString(char *str) { while(*str != '\0') { SBUF = *str++; // 将字符写入发送缓冲区 while(!TI); // 等待发送完成(TI=1) TI = 0; // 必须软件清除发送标志 } } /*------------------------------------------------ 函数名称:main 功能描述:主函数,程序入口 ------------------------------------------------*/ void main() { UART_Init(); // 初始化串口 LED = 1; // 初始关闭LED(高电平) BUZZER = 0; // 初始关闭蜂鸣器(低电平) while(1) { // 主循环 if(rx_flag) { // 检测到串口接收完成 if(rx_data == 'F') { // 收到字符'F' LED_Blink(3); // LED闪烁3次 UART_SendString("MCS-51Microcomputer"); // 发送确认信息 } else { // 收到其他字符 Buzzer_Beep(3); // 蜂鸣器报警3次 UART_SendString("Error"); // 发送错误信息 } rx_flag = 0; // 清除接收标志 } } } /*------------------------------------------------ 中断名称:UART_ISR 中断号: 4(串口中断) 功能描述:串口中断服务程序 ------------------------------------------------*/ void UART_ISR() interrupt 4 { if(RI) { // 检查接收中断标志 RI = 0; // 必须软件清除接收标志 rx_data = SBUF; // 读取接收数据 rx_flag = 1; // 置位接收标志(主循环处理) } } 这是用keil编写的代码,用于实现proteus电路图中运行效果,优化一下这段代码使其运行不报错。
最新发布
05-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值