pb调用
ll_ret = linet_main.PostURL(ls_url,blob_file,ls_headers,9080,luo_data)有帮忙者,定重谢旅客入住登记信息上报规范目的
该文档详细描述了酒店在进行旅客入住登记后,如何将旅客入住信息上传至旅店业治安管理信息系统,并制定了相关规范。通过该规范,可以保证旅客入住信息及时,完整的被传输至局端。概述
由于已有酒店管理系统种类繁多,且差异较大,所以该规范采用了与平台、语言无关的通用协议。
该规范分为两个部,第一部分是对旅客入住登记信息组织以及格式的规范,第二部分是对旅客入住登记信息传输到局端旅店业治安管理信息系统的规范。
上报规范
旅客入住登记信息采集规范
旅客入住登记信息采集分为两个部分,一部分是旅客身份信息的文字描述,这部分内容需要以文本的形式存储在文本文件(txt)中,一个旅客对应一个文本文件,该文件需要使用GBK或GB2312编码进行存储;另外一部分是旅客的照片,该信息需要以二进制存储为jpeg或bmp格式的文件中,一个旅客对应一个文件。存储旅客身份信息的文本文件中需要包含旅客照片的文件名信息。
1、 境内入住
A、CI(第一个C表示境内,第二个I表示入住) (必须填写)
B、酒店管理系统的旅客编码(必须唯一,必须填写,长度必段22位,必须是旅馆代码(10位)+任意12位,这12位可以是时间字符串,只要不重复)
  例:4101000000+YYMMDDHHMMSS(年的后两位月日时分秒)
C、姓名:30位(必须填写)
D、性别: 1位(男为1,女为2,必须填写,代码)  
E、民族:(必须填写,代码)
F、出生日期:8位,YYYYMMDD(必须填写)
G、证件名称:(必须填写,代码)
H、证件号码:18位, (必须填写)
I、行政区划:(必须填写,代码)
J、详细住址:40位
K、入住时间:12位,YYYYMMDDHHNN,年月日时分(必须填写)
L、房间号:10位(必须填写)2、境外旅客入住
A、JI(第一个J表示境外,第二个I表示入住)(必须填写)
B、酒店管理系统的旅客编码(必须唯一,必须填写,长度必段22位,必须是旅馆代码(10位)+任意12位,这12位可以是时间字符串,只要不重复)
  例:4101000000+YYMMDDHHMMSS(年的后两位月日时分秒),
C、英文姓:20位(必须填写)
D、英文名:20位
E、中文姓名:30位
F、性别:1位(男为1,女为2,必须填写,代码)
G、出生日期:8位(必须填写)
H、国籍:(必须填写,代码)
I、证件类型:(必须填写,代码)
J、证件号码:16位(必须填写)
K、签证类型:(必须填写,代码)
L、签证号码:20位
M、停留期至:8位,YYYYMMDD,年月日(必须填写)
N、签证签发机关:(代码)
O、入境日期:8位(必须填写)
P、入境口岸:3位(必须填写,代码)
Q、入住时间:12位,YYYYMMDDHHNN,年月日时分(必须填写)
R、房间号:10位(必须填写)
S、何处来:国内地市(代码)
T、何处去:国内地市(代码)注释:1.分隔符为回车换行,没有值以空行代替。
2.转换文件提供的各项必须是公安部对应的代码
3、生成TXT文件,必须按照以上A、B、C,,,,,,,,,,,,,这样的顺序。
4、旅馆系统的房间号必须与本洒店的房间号一一对应。
登记信息传输规范
该规范用于将采集的旅客入住登记信息传输到局端旅店业治安管理信息系统。需要传输的信息为一个或多个文本文件(txt),以及存储照片的二进制文件。
传输采用HTTP multipart/form-data的方式,使用http专为文件上传建立的rfc1867协议(协议详细介绍http://www.ietf.org/rfc/rfc1867.txt)。Microsoft IE, Mozila, Opera 等都已经支持此协议,在网页中使用一个特殊的 form 就可以发送文件。绝大部分 http 服务器,包括 tomcat ,weblogic,websphere,jboss,已经支持此协议,可接受发送来的文件。各种网页程序,如 php, asp, jsp,dotnet等,对于上传文件已经做了很好的封装。
如果客户端不是采用浏览器,而是C/S的架构,或是需要进行实时上传的,则可通过相应开发语言的http包,来模拟http请求上传文件。
rfc1867协议本身是建立在http协议上的,报文头格式以及注释如下:Content-Type: multipart/form-data; boundary=--------------------------7d93b91e2404d①
\r\n
Content-Length: 299⑦
\r\n
\r\n
-----------------------------7d93b91e2404d②
\r\n
Content-Disposition: form-data; name="guest"; filename="c:\eben.txt"
\r\n
Content-Type: text/plain
\r\n
\r\n③
旅客身份文本文件内容的二进制字节
\r\n④
-----------------------------7d93b91e2404d --⑤
\r\n⑥
Content-Disposition: form-data; name="photo"; filename="c:\photo.jpg"
\r\n
Content-Type: image/jpeg
\r\n
\r\n
旅客照片内容的二进制字节
\r\n
-----------------------------7d93b91e2404d
\r\n说明:
① Content-Type必须指定boundary。其中前面的“---------------------------7d”是 IE 特有的标志。其后的字符串“7d93b91e2404d”是随机生成的字符串。Boundary是文件上传时表单中文件分割线。
② 请求报文体中的分割线
 “-----------------------------7d93b91e2404d”

boundary=---------------------------7d93b91e2404d
中的分割线前面多“--”。
③ 表单中上传文件的请求头和文件数据之间的分割符是“\r\n \r\n”。与HTTP请求报文头与报文体之间的分割符相同。
④ 上传文件结尾需要追加分割符“\r\n”。
⑤ 最后一个文件结尾的分割线“ -----------------------------7d93b91e2404da--”,即boundary之前和结尾都需要追加“--”。最后一个分割线比较特殊,注意不要忘记后面的“--”。
⑥ 最后请求报文结尾需要追加分割符“\r\n”。
⑦ 最后需要注意的是请求报文头中的Content-Length参数的值是整个报文体的长度。即从分割线②第一个字符开始,到报文结尾分割符“\r\n”为止的整个长度。注意不要漏掉计算报文结尾分割符“\r\n”的长度,否则Content-Length参数的值变为了297, 就会出错。
上面的报文头演示了上传旅客信息身份信息以及照片的详细格式,注意加黑的斜体部分,分别代表了这两种文件的不同。
上传文件处理服务
  VPN: http:// 61.163.108.195:9080/getguestfile/service/acceptfile/upfile使用上面描述的http头格式,将请求发送上面的服务地址,完成文件上传工作,如果该服务返回“ok” 字样,则表示文件上传成功,如果返回“error_xx”(xx表示错误代码),则表示文件上传失败,需要根据具体的错误代码排除问题。
02 处理数据文件出错。
11 错误的文件类型
12 数据文件提交不全
13 数据文件超过文件大小。
21 旅客编码不能为空,长度必须22位
22 国内旅客姓名不能为空,
23 旅客性别不能为空。
24 旅客民旅不能为空。
25 旅客出生日期不能为空。
26 证件种类不能为空
27 证件号码不能为空。
28 行政区划不能为空。
29 详细地址不能为空。
20 入住时间不能为空。
2A 房间号码不能为空。
2B 一条信息不能保存两次。
JW1 英文姓不能为空。
JW2 国藉不能为空。
JW3 签证种类不能为空。
JW4 停留有效不能为空。
JW5 入境日期不能为空。
JW6 签证号码不能为空。
AA 系统到期,请缴费。浏览器端实现
由于HTTP的rfc1867协议是专为浏览器而设计的,所以使用基于web的浏览器端的实现最为简单方便,使用<form method="post" enctype="multipart/form-data"> <input type=”file”></form>标签即可,完整的实现如下:<form name="form1" enctype="multipart/form-data" method="post" action="上传文件处理服务地址">
  旅客信息(txt): <input type="file" name="guest"></br>
  旅客照片(jpg): <input type="file" name="photo"></br>
  <input type="submit" name="Submit" value="提交 ">
</form>
需要注意的是form表单需要加入enctype="multipart/form-data",以及使用post方式提交,旅客信息标签的name设为guest,旅客照片标签name设为photo。实时上传(JAVA)
对于需要实时上传登记信息,或是非web应用程序上传登记信息的情况,则需要使用相应开发语言的http类库(包),并遵循上面描述rfc1867协议传输文件。下面使用JAVA语言做为例子来解释说明,其它开发语言与此类似。
package com.xxx.getguestfile.sample;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class TestUpload {
public final static void main(String[] args) throws Exception {
// 使用http协议,按照rfc1867协议标准发送文件
File guest = new File("c:\\test.txt"); //旅客身份信息文本文件
File photo = new File("c:\\photo1.jpg"); //旅客照片String BOUNDARY = "---------------------------198152288819156"; // 分隔符
// 旅客身份信息文本文件上传的http请求头
StringBuffer sbGuest = new StringBuffer();
sbGuest = sbGuest.append("--");
sbGuest = sbGuest.append(BOUNDARY);
sbGuest = sbGuest.append("\r\n");
sbGuest = sbGuest.append("Content-Disposition: form-data; name=\""
+ "guest" + "\"; filename=\"" + guest.getAbsolutePath()
+ "\"\r\n");
sbGuest = sbGuest.append("Content-Type: text/plain\r\n\r\n");
byte[] start_data_guest = sbGuest.toString().getBytes();// 旅客照片上传的http请求头
StringBuffer sbPhoto = new StringBuffer();
sbPhoto = sbPhoto.append("--");
sbPhoto = sbPhoto.append(BOUNDARY);
sbPhoto = sbPhoto.append("\r\n");
sbPhoto = sbPhoto.append("Content-Disposition: form-data; name=\""
+ "photo" + "\"; filename=\"" + photo.getAbsolutePath()
+ "\"\r\n");
sbPhoto = sbPhoto
.append("Content-Type: image/jpg\r\n\r\n");
byte[] start_data_photo = sbPhoto.toString().getBytes();// http请求结尾
byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();// java的http相关类库,建 立http链接
URL url = null;
HttpURLConnection connection = null;
url = new URL(
"http://xxx/getguestfile/service/acceptfile/upfile"); //上传文件处理服务地址
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST"); //使用post发送connection.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY);
connection.setRequestProperty("Content-Length", String
.valueOf(start_data_guest.length+start_data_photo.length + guest.length()+photo.length()
+ end_data.length*2)); //计算报文长度
connection.setUseCaches(false);
connection.connect();// 发送参数
DataOutputStream out = new DataOutputStream(connection
.getOutputStream());
out.write(start_data_guest);
out.write(getFile(guest)); //文件的字节数组
out.write(end_data);out.write(start_data_photo);
out.write(getFile(photo));   
out.write(end_data);out.flush();
out.close();if (connection.getResponseCode() == 200) {InputStream u = connection.getInputStream();// 获取http连接的返回内容
BufferedReader in = new BufferedReader(new InputStreamReader(u));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
}
System.out.println("返回值" + buffer.toString()); //返回ok表示上传成功
} else {
System.out.println("连接失败");
}connection.disconnect();
}private static byte[] getFile(File file) throws Exception {
FileInputStream da = new FileInputStream(file);
byte[] content = new byte[(int) file.length()];
if (file.length() > 0) {
da.read(content);
}
return content;}
}