apicloud apicloud

注册
查看: 6851|回复: 6

[APP开发技巧] ajax上传文件到服务器

转正司机

UID:22430

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

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

[APP开发技巧] ajax上传文件到服务器

6851 6 | 发表于 2015-9-2 14:35:45 |阅读模式 | |
1、图片base64上传注意的地方就是传到后台需要截取一部分才能转换为图片,用到ac里的getPicture,后台就需要处理传过来的字符串 前面是格式类型你会发现逗号前面都是多余的,所以截取逗号以后的那一串然后用base64解析成图片。

2、文件的上传,ac都是ajax提交数据,multipart/form-data,我把代码贴一下,希望能帮助一些人。
前端代码很简单:
  1. api.ajax({
  2.                                                             url: 'http://192.168.18.53:8080/router?method=uploadAmrFile&name=haha&format=json&v=1.0',
  3.                                                             method: 'post',
  4.                                                             timeout: 90,
  5.                                                             dataType: 'json',
  6.                                                             returnAll:false,
  7.                                                             data:{
  8.                                                                 files:{file:"文件路径"}
  9.                                                             }
  10.                                                         },function(ret,err){
  11.                                                         });
复制代码
底层架构就不说了,后台代码参考一下吧。
后端接收文件处理代码:(HttpServletRequest)
  1. public class UploadFileHessian {
  2.         protected Logger log = Logger.getLogger(this.getClass());
  3.         //构造类
  4.         class Position {
  5.                 int begin;
  6.                 int end;
  7.                 public Position(int begin, int end) {
  8.                     this.begin = begin;
  9.                     this.end = end;
  10.                 }
  11.         }
  12.        
  13.         //转换文件
  14.         protected void processRequest(HttpServletRequest request,String path)throws ServletException, IOException {
  15.                 //读取请求Body
  16.                 byte[] body = readBody(request);
  17.                 //取得所有Body内容的字符串表示
  18.                 String textBody = new String(body);
  19.                 //上传文件名称
  20.                 String fileName = getFileName(textBody);
  21.                 //取得文件开始与结束位置
  22.                 Position p = getFilePosition(request, textBody);
  23.                 //输出至文件
  24.                 String path1 = writeTo(fileName, body, p,path);
  25.                 //String path2 = "E:\\aa\\1395047224460.mp3";  
  26.                 //changeToMp3(path1, path2);
  27.         }
  28.         //读取文件
  29.         private byte[] readBody(HttpServletRequest request) throws IOException {
  30.                 //获取请求文本字节长度
  31.                 int formDataLength = request.getContentLength();
  32.                 //取得ServletInputStream输入流对象
  33.                 DataInputStream dataStream = new DataInputStream(request.getInputStream());
  34.                 byte body[] = new byte[formDataLength];
  35.                 int totalBytes = 0;
  36.                 while (totalBytes < formDataLength) {
  37.                     int bytes = dataStream.read(body, totalBytes, formDataLength);
  38.                     totalBytes += bytes;
  39.                 }
  40.                 return body;
  41.         }
  42.         //获取内容位置
  43.         private Position getFilePosition(HttpServletRequest request, String textBody) throws IOException {
  44.                 //取得文件区段边界信息
  45.                 String contentType = request.getContentType();
  46.                 String boundaryText = contentType.substring(contentType.lastIndexOf("=") + 1, contentType.length());
  47.                 //取得实际上传文件的起始与结束位置
  48.                 int pos = textBody.indexOf("filename=\"");
  49.                 //TODO:这里根据返回的报文处理相应的长度  这里只需要获取内容不需要报文在内
  50.                 pos = textBody.indexOf("\n", pos) + 1;
  51.                 pos = textBody.indexOf("\n", pos) + 1;
  52.                 pos = textBody.indexOf("\n", pos) + 1;
  53.                 pos = textBody.indexOf("\n", pos) + 1;
  54.                
  55.                 int boundaryLoc = textBody.indexOf(boundaryText, pos) - 4;
  56.                 int begin = ((textBody.substring(0, pos)).getBytes()).length;
  57.                 int end = ((textBody.substring(0, boundaryLoc)).getBytes()).length;
  58.                
  59.                 return new Position(begin, end);
  60.         }
  61.         //获取文件名称
  62.         private String getFileName(String requestBody) {
  63.                 String fileName = requestBody.substring(requestBody.indexOf("filename=\"") + 10);
  64.                 fileName = fileName.substring(0, fileName.indexOf("\n"));
  65.                 fileName = fileName.substring(fileName.indexOf("\n") + 1, fileName.indexOf("\""));
  66.                 return fileName;
  67.         }
  68.         //保存文件
  69.         private String writeTo(String fileName, byte[] body, Position p,String path) throws IOException {
  70.                 FileOutputStream fileOutputStream = new FileOutputStream(path + fileName);
  71.                 fileOutputStream.write(body, p.begin, (p.end - p.begin));
  72.                 fileOutputStream.flush();
  73.                 fileOutputStream.close();
  74.                 return path + fileName;
  75.         }
  76.         //转换mp3
  77.         public void changeToMp3(String sourcePath, String targetPath) {  
  78.         File source = new File(sourcePath);  
  79.         File target = new File(targetPath);  
  80.         AudioAttributes audio = new AudioAttributes();  
  81.         Encoder encoder = new Encoder();  
  82.   
  83.         audio.setCodec("libmp3lame");  
  84.         EncodingAttributes attrs = new EncodingAttributes();  
  85.         attrs.setFormat("mp3");  
  86.         attrs.setAudioAttributes(audio);  
  87.         try {  
  88.             encoder.encode(source, target, attrs);  
  89.         }catch (Exception e) {  
  90.             e.printStackTrace();  
  91.         }
  92.     }
  93.         //上传语音
  94.     public Object uploadFile(UploadAmrFileRequest request){
  95.                 BaseResponse response = new BaseResponse();
  96.                 HttpServletRequest req = (HttpServletRequest) request.getRopRequestContext().getRawRequestObject();
  97.                 StringBuffer sb = new StringBuffer();
  98.                
  99.         Enumeration<?> en = req.getHeaderNames();  
  100.         while (en.hasMoreElements()) {  
  101.             String name = (String) en.nextElement();
  102.             String value = req.getHeader(name);
  103.             sb.append(name + "=" + value + "\r\n");  
  104.         }
  105.         System.out.println(sb.toString());
  106.         
  107.         ClassPathResource outFile = new ClassPathResource("/");
  108.                 String root;
  109.                 try {
  110.                         root = outFile.getFile().getParent().replace("\\WEB-INF", "").replace("/WEB-INF", "");
  111.                         String path = root+"\\upload\\";
  112.                         processRequest(req,path);
  113.                 } catch (Exception e) {
  114.                         e.printStackTrace();
  115.                 }
  116.         return response;  
  117.     }
  118. }
复制代码



文件的上传就到此了,能帮助的就看看

1

查看全部评分

主题:
0
帖子:
23
云币:
89
发表于 2015-9-2 23:56:18 |
收藏有用,准备用到

业余车手

UID:22414

主题:
8
帖子:
815
云币:
12667

版主勋章APICloud粉丝

发表于 2015-9-3 08:36:49 |
感谢分享

驾校小白

UID:297819

主题:
1
帖子:
26
云币:
207
发表于 2016-6-1 16:50:00 来自手机 |
感谢楼主分享!!战略性mark

驾校小白

UID:362165

主题:
1
帖子:
4
云币:
55
发表于 2016-6-1 17:57:43 |
前排   围观  收藏

马路杀手

UID:451969

主题:
77
帖子:
309
云币:
582

女朋友强者APICloud粉丝

发表于 2016-11-1 17:29:26 |
感谢分享!!!!

转正司机

UID:22430

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

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

 楼主| 发表于 2016-11-3 09:34:56 |
funy 发表于 2016-11-1 17:29
感谢分享!!!!

不客气  希望能帮助到你
您需要登录后才可以回帖 登录 | 立即注册

快速回复 返回顶部 返回列表