apicloud apicloud

注册
查看: 7759|回复: 22

[模块教程] uichatbox集成语音、图片(上传到服务器)

转正司机

UID:22430

主题:
27
帖子:
549
云币:
3971

我李白贼6APICloud粉丝连续签到100天一周年中秋节社会摇圣诞节老司机你吃屎!托马斯全旋女朋友单身狗

[模块教程] uichatbox集成语音、图片(上传到服务器)

7759 22 | 发表于 2015-8-3 20:08:25 |阅读模式 | |
本帖最后由 zjjay 于 2015-8-3 20:18 编辑

1、为了模仿聊天及其集成语音功能,就做了一个例子和大家分享一下快乐时光
2、功能包括录制语音、上传语音文件到服务器、图片预览、图片上传base64
3、之前的想法主要利用和图片上传一样采用base64,结果在ac找了一遍发现没有支撑的,技术说压缩太大暂时提供,无意之间看到了api.ajax里存在files属性于是自己动手写了一个demo,暂时不支持多文件上传,不足之处也可以自己动手再次改进。。。。(求不吐槽)
demo截图:


前端代码分享:
api.ajax({
                                                            url: 'http://192.168.18.53:8080/router?method=xxxxxxxxx&format=json&v=1.0',
                                                            method: 'post',
                                                            timeout: 90,
                                                            dataType: 'json',
                                                            returnAll:false,
                                                            data:{
                                                                files:{file:ret.path}
                                                                //files:{file:"fs://res/aaa.txt"}
                                                            }
                                                        },function(ret,err){
                                                            if (ret) {
                                                                var urlJson = JSON.stringify(ret);
                                                                api.alert({msg: urlJson});
                                                            }else {
                                                                api.alert({
                                                                    msg'错误码:'+err.code+';错误信息:'+err.msg+'网络状态码:'+err.statusCode)
                                                                });
                                                            }
                                                        });


后端采用java:
        //构造类
        class Position {
                int begin;
                int end;
                public Position(int begin, int end) {
                    this.begin = begin;
                    this.end = end;
                }
        }
        
        //转换文件
        protected void processRequest(HttpServletRequest request,String path)throws ServletException, IOException {
                //读取请求Body
                byte[] body = readBody(request);
                //取得所有Body内容的字符串表示
                String textBody = new String(body);
                //上传文件名称
                String fileName = getFileName(textBody);
                //取得文件开始与结束位置
                Position p = getFilePosition(request, textBody);
                //输出至文件
                String path1 = writeTo(fileName, body, p,path);
                String path2 = "E:\\zhoujian\\1395047224460.mp3";  
                changeToMp3(path1, path2);
        }
        //读取文件
        private byte[] readBody(HttpServletRequest request) throws IOException {
                //获取请求文本字节长度
                int formDataLength = request.getContentLength();
                //取得ServletInputStream输入流对象
                DataInputStream dataStream = new DataInputStream(request.getInputStream());
                byte body[] = new byte[formDataLength];
                int totalBytes = 0;
                while (totalBytes < formDataLength) {
                    int bytes = dataStream.read(body, totalBytes, formDataLength);
                    totalBytes += bytes;
                }
                return body;
        }
        //获取内容位置
        private Position getFilePosition(HttpServletRequest request, String textBody) throws IOException {
                //取得文件区段边界信息
                String contentType = request.getContentType();
                String boundaryText = contentType.substring(contentType.lastIndexOf("=") + 1, contentType.length());
                //取得实际上传文件的起始与结束位置
                int pos = textBody.indexOf("filename=\"");
                //TODO:这里根据返回的报文处理相应的长度  这里只需要获取内容不需要报文在内
                pos = textBody.indexOf("\n", pos) + 1;
                pos = textBody.indexOf("\n", pos) + 1;
                pos = textBody.indexOf("\n", pos) + 1;
                pos = textBody.indexOf("\n", pos) + 1;
               
                int boundaryLoc = textBody.indexOf(boundaryText, pos) - 4;
                int begin = ((textBody.substring(0, pos)).getBytes()).length;
                int end = ((textBody.substring(0, boundaryLoc)).getBytes()).length;
               
                return new Position(begin, end);
        }
        //获取文件名称
        private String getFileName(String requestBody) {
                String fileName = requestBody.substring(requestBody.indexOf("filename=\"") + 10);
                fileName = fileName.substring(0, fileName.indexOf("\n"));
                fileName = fileName.substring(fileName.indexOf("\n") + 1, fileName.indexOf("\""));
                return fileName;
        }
        //保存文件
        private String writeTo(String fileName, byte[] body, Position p,String path) throws IOException {
                FileOutputStream fileOutputStream = new FileOutputStream(path + fileName);
                fileOutputStream.write(body, p.begin, (p.end - p.begin));
                fileOutputStream.flush();
                fileOutputStream.close();
                return path + fileName;
        }
        //转换mp3
        public void changeToMp3(String sourcePath, String targetPath) {  
        File source = new File(sourcePath);  
        File target = new File(targetPath);  
        AudioAttributes audio = new AudioAttributes();  
        Encoder encoder = new Encoder();  

        audio.setCodec("libmp3lame");  
        EncodingAttributes attrs = new EncodingAttributes();  
        attrs.setFormat("mp3");  
        attrs.setAudioAttributes(audio);  
        try {  
            encoder.encode(source, target, attrs);  
        }catch (Exception e) {  
            e.printStackTrace();  
        }
    }
        //上传语音
    public Object uploadFile(UploadAmrFileRequest request){
                BaseResponse response = new BaseResponse();
                HttpServletRequest req = (HttpServletRequest) request.getRopRequestContext().getRawRequestObject();
                StringBuffer sb = new StringBuffer();
               
        Enumeration<?> en = req.getHeaderNames();  
        while (en.hasMoreElements()) {  
            String name = (String) en.nextElement();
            String value = req.getHeader(name);
            sb.append(name + "=" + value + "\r\n");  
        }
        System.out.println(sb.toString());

        ClassPathResource outFile = new ClassPathResource("/");
                String root;
                try {
                        root = outFile.getFile().getParent().replace("\\WEB-INF", "").replace("/WEB-INF", "");
                        String path = root+"\\upload\\";
                        processRequest(req,path);
                } catch (Exception e) {
                        e.printStackTrace();
                }
        return response;  
    }

本帖子中包含更多资源    您需要 登录 才可以下载或查看,没有帐号?立即注册

2

查看全部评分

转正司机

UID:22430

主题:
27
帖子:
549
云币:
3971

我李白贼6APICloud粉丝连续签到100天一周年中秋节社会摇圣诞节老司机你吃屎!托马斯全旋女朋友单身狗

 楼主| 发表于 2015-8-3 20:16:44 |
自己抢沙发  tip:里面存在amr格式转换mp3用到了jave.jar

新手上路

UID:121690

主题:
4
帖子:
29
云币:
65
发表于 2015-8-3 20:31:05 |
源码打包出来分享  

主题:
0
帖子:
19
云币:
37
发表于 2015-8-8 22:39:16 |
源码打包出来分享

业余车手

UID:22235

主题:
89
帖子:
1166
云币:
10259

版主勋章APICloud粉丝端午节