您的位置:首页 > 编程语言 > Go语言

Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件 推荐

2014-05-17 21:19 387 查看
首先看下服务器端,服务器端使用martini框架,仅建立一个简单的接收客户端post请求并保存客户端传过来的语音的后台服务:
原文地址:http://liuxp0827.blog.51cto.com/5013343/1412977
package main

//http://liuxp0827.blog.51cto.com/5013343/1412977

import (
"bufio"
"github.com/go-martini/martini"
"io/ioutil"
"log"
"net/http"
"os"
)

func main() {
m := martini.Classic()

m.Post("/wave", func(req *http.Request) {
file, _, err := req.FormFile("file")
if err != nil {
log.Fatal("FormFile: ", err.Error())
os.Exit(2)
}
defer func() {
if err := file.Close(); err != nil {
log.Fatal("Close: ", err.Error())
os.Exit(2)
}
}()

localFile, _ := os.Create("1.wav")
defer localFile.Close()
writer := bufio.NewWriter(localFile)
bytes, err := ioutil.ReadAll(file)
if err != nil {
log.Fatal("ReadAll: ", err.Error())
os.Exit(2)
}

writer.Write(bytes)
writer.Flush()
})

http.ListenAndServe(":8080", m)
}
再来看下客户端的java代码,首先调用readWavform函数从本地读取语音文件到byte[],然后设置相应的POST头信息,最终发送数据:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

//http://liuxp0827.blog.51cto.com/5013343/1412977

public final class upload {

public static void main(String[] args) {
Map<String, String> parameters = new HashMap<String, String>();
byte[] data = readWavform("C:\\Users\\PONPON\\Desktop\\test.wav");
doUploadFile("http://localhost:8080/wave", parameters,
Constants.FILEPARAM, "11.wav", "multipart/form-data;",
data);
}

public static byte[] readWavform(String filename) {

int regLen = 0;
byte[] regbuffer = null;
try {
FileInputStream inputsteam = new FileInputStream(new File(filename));

regLen = inputsteam.available();
regbuffer = new byte[regLen];
if ((regLen = inputsteam.read(regbuffer, 0, regLen)) < 0) {
System.out.println("error when read pcm file.");
}

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return regbuffer;
}

public static String doUploadFile(String reqUrl,
Map<String, String> parameters, String fileParamName,
String filename, String contentType, byte[] data) {
HttpURLConnection urlConn = null;
try {
urlConn = sendFormdata(reqUrl, parameters, fileParamName, filename,
contentType, data);
String responseContent = new String(getBytes(urlConn));
return responseContent.trim();
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
if (urlConn != null) {
urlConn.disconnect();
}
}
}

private static HttpURLConnection sendFormdata(String reqUrl,
Map<String, String> parameters, String fileParamName,
String filename, String contentType, byte[] data) {
HttpURLConnection urlConn = null;
try {
URL url = new URL(reqUrl);
urlConn = (HttpURLConnection) url.openConnection();
urlConn.setRequestMethod("POST");
urlConn.setConnectTimeout(10000);// (单位:毫秒)jdk
urlConn.setReadTimeout(10000);// (单位:毫秒)jdk 1.5换成这个,读操作超时
urlConn.setDoOutput(true);
urlConn.setRequestProperty("connection", "keep-alive");

String boundary = "-----------------------------114975832116442893661388290519"; // 分隔符
urlConn.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + boundary);

boundary = "--" + boundary;
StringBuffer params = new StringBuffer();
if (parameters != null) {
for (Iterator<String> iter = parameters.keySet().iterator(); iter
.hasNext();) {
String name = iter.next();
String value = parameters.get(name);
params.append(boundary + "\r\n");
params.append("Content-Disposition: form-data; name=\""
+ name + "\"\r\n\r\n");
params.append(value);
params.append("\r\n");
}
}
StringBuilder sb = new StringBuilder();
sb.append(boundary);
sb.append("\r\n");
sb.append("Content-Disposition: form-data; name=\"" + fileParamName
+ "\"; filename=\"" + filename + "\"\r\n");
sb.append("Content-Type: " + contentType + "\r\n\r\n");
byte[] fileDiv = sb.toString().getBytes("UTF-8");
byte[] endData = ("\r\n" + boundary + "--\r\n").getBytes("UTF-8");
byte[] ps = params.toString().getBytes("UTF-8");
OutputStream os = urlConn.getOutputStream();
os.write(ps);
os.write(fileDiv);
os.write(data);
os.write(endData);
os.flush();
os.close();
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
return urlConn;
}
private static byte[] getBytes(HttpURLConnection urlConn) {
try {
InputStream in = urlConn.getInputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
for (int i = 0; (i = in.read(buf)) > 0;)
os.write(buf, 0, i);
in.close();
return os.toByteArray();
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
这只是简单的功能实现,后面可以用martini拓展,写一个简单的web语音识别服务,用android录音后发送POST请求,把语音数据发送到服务器处理识别,再返回json格式的识别结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  客户端 参数 golang
相关文章推荐