Golang 建立RESTful webservice 接收客户端POST请求发送wav语音
发布时间:2020-12-16 18:52:42 所属栏目:大数据 来源:网络整理
导读:首先看下服务器端,服务器端使用martini框架,仅建立一个简单的接收客户端post请求并保存客户端传过来的语音的后台服务: 原文地址:http://www.jb51.cc/article/p-tonyjcqq-hg.html package main //http://liuxp0827.blog.51cto.com/5013343/1412977 import
首先看下服务器端,服务器端使用martini框架,仅建立一个简单的接收客户端post请求并保存客户端传过来的语音的后台服务: 原文地址:http://www.52php.cn/article/p-tonyjcqq-hg.html 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:UsersPONPONDesktoptest.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,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,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,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 + "rn"); params.append("Content-Disposition: form-data; name="" + name + ""rnrn"); params.append(value); params.append("rn"); } } StringBuilder sb = new StringBuilder(); sb.append(boundary); sb.append("rn"); sb.append("Content-Disposition: form-data; name="" + fileParamName + ""; filename="" + filename + ""rn"); sb.append("Content-Type: " + contentType + "rnrn"); byte[] fileDiv = sb.toString().getBytes("UTF-8"); byte[] endData = ("rn" + boundary + "--rn").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,i); in.close(); return os.toByteArray(); } catch (Exception e) { throw new RuntimeException(e.getMessage(),e); } } } 这只是简单的功能实现,后面可以用martini拓展,写一个简单的web语音识别服务,用android录音后发送POST请求,把语音数据发送到服务器处理识别,再返回json格式的识别结果。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |