赞 | 400 |
VIP | 0 |
好人卡 | 24 |
积分 | 250 |
经验 | 45372 |
最后登录 | 2024-7-2 |
在线时间 | 3339 小时 |
Lv5.捕梦者 (版主)
- 梦石
- 1
- 星屑
- 23994
- 在线时间
- 3339 小时
- 注册时间
- 2011-7-8
- 帖子
- 3926
|
本帖最后由 guoxiaomi 于 2017-6-16 22:29 编辑
刚刚研究出来如何上传和下载文件,其实也没有什么难的地方,这里就作为试用反馈写下来吧!
下载:
1. 准备一个可以访问的地址,比如- http://server.com/test.txt
复制代码
2. 使用 AsHttp,GET 方案- url = "http://server.com/test.txt"
- query = AsHttp::Query.make(url, "GET")
- query.set_header("User-Agent","AsHttp")
- query.set_data("t=#{rand}")
-
- query.start{
- if query.finished?
- $data = ""
- $data << query.data
- else
- # produce_network_error
- end
- query.finalize
- }
复制代码 3. 上面的请求在成功的时候,就已经把 GET 到的数据写入了 $data 里,下面写入文件 result:- File.open('result', "wb") do |f|
- f << $data
- end
复制代码 注意写入模式是 "wb", 然后改一下文件名就行了。除此之外的还有一点是,不要在 start 的 block 里面处理文件的写入,因为这个线程老是动不动就暂停。
上传:
POST 请求分为 header 和 content 两个部分,每个 header 一行一个,换行符是 \r\n,当遇到连续两个 \r\n 时,header 部分结束,后面的数据全部是 content。
对于一般的 post 请求, content 里面就是跟 get 请求一样的一行字符串,只是 get 请求是串在地址后面。
但是上传文件的 post 请求,就要使用到 boundary。boundary 的规则是这样的:
1. header Content-Type 中要设置好 boundary 的值,一般取30-40长度的随机字符串
2. content 的第一行是 boundary,但是前面要加 '--'。
3. content 的最后一行也是 boundary,但是前后都要加 '--'。
所以先设置好 header,接着是一个空行,然后是 boundary 和文件属性、文件大小、文件内容以及结尾的 boundary 。
用 ashttp 库里面的方法就是这样做的,提供了两个方法:set_header 和 set_data 。
"脑补"
如此写代码就可以生成一个提交文件的 POST 请求。
- file = File.open(filename, "rb")
- filedata = ""
- filedata << file.read
- file.close
- url = "http://server.com/recieve.php" # url 换成自己要用的 url # 没错,PHP 就是最好的语言! # 划掉
- query = AsHttp::Query.make(url,"POST")
- query.set_header("User-Agent", "AsHttp")
- boundary = '-------------------BZuyg871afvOGVui'
- query.set_header("Content-Type", "multipart/form-data;boundary=#{boundary}")
- post_data = ""
- post_data << "--" << boundary << "\r\n"
- post_data << "Content-Disposition: form-data; name=\"file\"; filename=\"#{filename}\"\r\n"
- post_data << "Content-Type: text/plain\r\n"
- post_data << "\r\n"
- post_data << filedata
- post_data << "\r\n--" << boundary << "--"
- query.set_data(post_data)
- query.start
复制代码
至于服务端如何读取文件,那个就跟这个库没有关系了。
|
|