【笔记】上传图片和音频

  1 package image;
  2 
  3 
  4 import java.io.File;
  5 import java.io.IOException;
  6 import java.io.PrintWriter;
  7 import java.util.List;
  8 import java.util.UUID;
  9 
 10 import javax.servlet.ServletConfig;
 11 import javax.servlet.ServletContext;
 12 import javax.servlet.ServletException;
 13 import javax.servlet.http.HttpServlet;
 14 import javax.servlet.http.HttpServletRequest;
 15 import javax.servlet.http.HttpServletResponse;
 16 
 17 import org.apache.commons.fileupload.FileItem;
 18 import org.apache.commons.fileupload.FileUploadException;
 19 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 20 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 21 
 22 
 23 /**
 24  * 文件上传
 25  * @author Administrator
 26  *
 27  */
 28 public class ImageAction extends HttpServlet {
 29     
 30       private static final long serialVersionUID = 1L;  
 31       
 32         // 保存文件的目录
 33         private static String PATH_FOLDER1 = "/";
 34         private static String PATH_FOLDER2 = "/";
 35         // 存放临时文件的目录
 36         private static String TEMP_FOLDER = "/";
 37         
 38         
 39         @Override
 40         public void init(ServletConfig config) throws ServletException {
 41             ServletContext servletCtx = config.getServletContext();
 42             // 初始化路径
 43             // 保存文件的目录
 44             PATH_FOLDER1 = servletCtx.getRealPath("/audioUpload");
 45             PATH_FOLDER2 = servletCtx.getRealPath("/imageUpload");
 46             // 存放临时文件的目录,存放xxx.tmp文件的目录
 47             TEMP_FOLDER = servletCtx.getRealPath("/uploadTemp");
 48         }
 49 
 50         /**
 51          * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
 52          *      response)
 53          */
 54         protected void doGet(HttpServletRequest request,
 55                 HttpServletResponse response) throws ServletException, IOException {
 56             request.setCharacterEncoding("utf-8"); // 设置编码
 57             response.setCharacterEncoding("utf-8");
 58             response.setContentType("text/html;charset=UTF-8");
 59             String method = request.getParameter("method");
 60             if (method == null) {
 61                 method = "image";
 62             }
 63 
 64             if ("image".equals(method)) {
 65                 image(request, response);
 66             } else if ("audio".equals(method)) {
 67                 audio(request, response);
 68             }
 69         }
 70         private void image(HttpServletRequest request,
 71                 HttpServletResponse response) {
 72             // 获得磁盘文件条目工厂
 73             DiskFileItemFactory factory = new DiskFileItemFactory();
 74             
 75             // 如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
 76             // 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
 77             /**
 78              * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem
 79              * 格式的 然后再将其真正写到 对应目录的硬盘上
 80              */
 81             factory.setRepository(new File(TEMP_FOLDER));
 82             // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
 83             factory.setSizeThreshold(1024 * 1024);
 84 
 85             // 高水平的API文件上传处理
 86             ServletFileUpload upload = new ServletFileUpload(factory);
 87             
 88             try {
 89                 // 提交上来的信息都在这个list里面
 90                 // 这意味着可以上传多个文件
 91                 // 请自行组织代码
 92                 List<FileItem> list = upload.parseRequest(request);
 93                 // 获取上传的文件
 94                 FileItem item = getUploadFileItem(list);
 95                 // 获取文件名
 96                 String filename = getUploadFileName1(item);
 97                 
 98 //                System.out.println("存放目录:" + PATH_FOLDER);
 99 //                System.out.println("文件名:" + filename);
100                 // 真正写到磁盘上
101                 item.write(new File(PATH_FOLDER2, filename)); // 第三方提供的
102                 
103                 PrintWriter writer = response.getWriter();
104                 
105                 writer.print("{");
106 //                writer.print("msg:"文件大小:"+item.getSize()+",文件名:"+filename+""");
107                 writer.print("msg:""+filename+""");
108                 writer.print("}");
109                 
110                 writer.close();
111             
112             } catch (FileUploadException e) {
113                 e.printStackTrace();
114             } catch (Exception e) {
115                 e.printStackTrace();
116             }
117             
118             
119         }
120         private void audio(HttpServletRequest request,
121                 HttpServletResponse response) {
122             // 获得磁盘文件条目工厂
123             DiskFileItemFactory factory = new DiskFileItemFactory();
124             
125             // 如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
126             // 设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
127             /**
128              * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem
129              * 格式的 然后再将其真正写到 对应目录的硬盘上
130              */
131             factory.setRepository(new File(TEMP_FOLDER));
132             // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
133             factory.setSizeThreshold(1024 * 1024);
134 
135             // 高水平的API文件上传处理
136             ServletFileUpload upload = new ServletFileUpload(factory);
137             
138             try {
139                 // 提交上来的信息都在这个list里面
140                 // 这意味着可以上传多个文件
141                 // 请自行组织代码
142                 List<FileItem> list = upload.parseRequest(request);
143                 // 获取上传的文件
144                 FileItem item = getUploadFileItem(list);
145                 // 获取文件名
146                 String filename = getUploadFileName2(item);
147                 filename=filename+".wav";
148 //                System.out.println("存放目录:" + PATH_FOLDER);
149 //                System.out.println("文件名:" + filename);
150                 // 真正写到磁盘上
151                 item.write(new File(PATH_FOLDER1, filename)); // 第三方提供的
152                 
153                 PrintWriter writer = response.getWriter();
154                 
155 //                writer.print("{");
156 //                writer.print("msg:"文件大小:"+item.getSize()+",文件名:"+filename+""");
157                 writer.print(filename);
158 //                writer.print("}");
159                 
160                 writer.close();
161             
162             } catch (FileUploadException e) {
163                 e.printStackTrace();
164             } catch (Exception e) {
165                 e.printStackTrace();
166             }
167             
168             
169         }
170         private FileItem getUploadFileItem(List<FileItem> list) {
171             for (FileItem fileItem : list) {
172                 if(!fileItem.isFormField()) {
173                     return fileItem;
174                 }
175             }
176             return null;
177         }
178         private String getUploadFileName1(FileItem item) {
179             // 获取路径名
180             String value = item.getName();
181             // 索引到最后一个反斜杠
182             int start = value.lastIndexOf("/");
183             // 截取 上传文件的 字符串名字,加1是 去掉反斜杠,
184             String name =UUID.randomUUID().toString().trim().replaceAll("-", "");
185             int sub = value.lastIndexOf(".");
186             String filename = value.substring(value.length()-sub,value.length());
187             
188             return name+filename;
189         }
190         private String getUploadFileName2(FileItem item) {
191             // 获取路径名
192             String value = item.getName();
193             // 索引到最后一个反斜杠
194             int start = value.lastIndexOf("/");
195             // 截取 上传文件的 字符串名字,加1是 去掉反斜杠,
196             String name =UUID.randomUUID().toString().trim().replaceAll("-", "");
197             String filename = value.substring(value.length()-4,value.length());
198             
199             return name+filename;
200         }
201         
202 
203         /**
204          * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
205          *      response)
206          */
207         protected void doPost(HttpServletRequest request,
208                 HttpServletResponse response) throws ServletException, IOException {
209             this.doGet(request, response);
210         }  
211 
212 
213 }
var imageName="";
function ajaxFileUpload() {
    
    $.ajaxFileUpload({  
        url : project+"/image/ImageAction?method=image",// servlet请求路径  
        secureuri : false,  
        fileElementId : 'fileToUpload',// 上传控件的id  
        async:false,
        dataType : 'json',  
        success : function(data, status) {  
            if(data.msg) {  
                imageName="["+data.msg+"]";
                sendImg();
            }  
        },  
        error : function(data, status, e) {  
            alert('发送图片出错');  
        }  
    }) 
    
}  

录音,上传

//调整兼容
navigator.getUserMedia=navigator.getUserMedia|| navigator.webkitGetUserMedia||navigator.mozGetUserMedia || navigator.msGetUserMedia;
//请求麦克风
    navigator.getUserMedia({audio: true},function(e){
        alert(1);
    var data,p;
    window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;
    alert(window.AudioContext);
    var context=new window.AudioContext();
  //从麦克风的输入流创建源节点
      var stream=context.createMediaStreamSource(e);
  //用于录音的processor节点
      var recorder=context.createScriptProcessor(1024,1,0);
      recorder.onaudioprocess=function(e){
         if(record.value=="停止")data.push(e.inputBuffer.getChannelData(0));
      };
  //用于播放的processor节点
  var player=context.createScriptProcessor(1024,0,1);
      player.onaudioprocess=function(e){
        if(!data)return;
        var i,s=data[p++];
        if(!s)return play.value=="停止"&&play.click();
        var buffer=e.outputBuffer.getChannelData(0);
        for(i=0;i<s.length;i++)buffer[i]=s[i];
  };
  
  
  //录音/停止 按钮点击动作
  var record = document.getElementById("record");
  record.onclick=function(){
    if(record.value=="录音")
      return data=[],stream.connect(recorder),this.value="停止",timedCount();
    if(record.value=="停止")
      return stream.disconnect(),save(),this.value="录音",stopCount();
  };
  
  var c=1;
  var t;
  function timedCount(){
      document.getElementById('timer').innerHTML=(c)+"秒";
      if(c<=60){
          c = c+1;
          t = setTimeout(timedCount,1000);
      }else{
          stream.disconnect(),save(c),document.getElementById("record").value="录音",stopCount();
      }
  }
  
  function stopCount(){
       c=1;
       clearTimeout(t);
       document.getElementById('timer').innerHTML="";
   }
  
 /*  //播放/停止 按钮点击动作
  play.onclick=function(){
    if(this.value=="播放")
      return p=0,player.connect(context.destination),this.value="停止";
    if(this.value=="停止")
      return player.disconnect(),this.value="播放";
  }; */
  //保存
  function save(){
      if(record.value=="停止"){
        var frequency=context.sampleRate; //采样频率
        var pointSize=16; //采样点大小
        var channelNumber=1; //声道数量
        var blockSize=channelNumber*pointSize/8; //采样块大小
        var wave=[]; //数据
        for(var i=0;i<data.length;i++)
          for(var j=0;j<data[i].length;j++)
            wave.push(data[i][j]*0x8000|0);
        var length=wave.length*pointSize/8; //数据长度
        var buffer=new Uint8Array(length+44); //wav文件数据
        var view=new DataView(buffer.buffer); //数据视图
        buffer.set(new Uint8Array([0x52,0x49,0x46,0x46])); //"RIFF"
        view.setUint32(4,data.length+44,true); //总长度
        buffer.set(new Uint8Array([0x57,0x41,0x56,0x45]),8); //"WAVE"
        buffer.set(new Uint8Array([0x66,0x6D,0x74,0x20]),12); //"fmt "
        view.setUint32(16,16,true); //WAV头大小
        view.setUint16(20,1,true); //编码方式
        view.setUint16(22,1,true); //声道数量
        view.setUint32(24,frequency,true); //采样频率
        view.setUint32(28,frequency*blockSize,true); //每秒字节数
        view.setUint16(32,blockSize,true); //采样块大小
        view.setUint16(34,pointSize,true); //采样点大小
        buffer.set(new Uint8Array([0x64,0x61,0x74,0x61]),36); //"data"
        view.setUint32(40,length,true); //数据长度
        buffer.set(new Uint8Array(new Int16Array(wave).buffer),44); //数据
        //打开文件
        var blob=new Blob([buffer],{type:"audio/wav"});
//        open(URL.createObjectURL(blob));

//        var form=document.forms[0];
        var formData = new FormData();  
        formData.append("imageName",blob); 
         $.ajax({
            url : project+"/image/ImageAction?method=audio",
            type : "POST",
            data : formData,
            dataType:"text",
            async:false,
            processData : false,         // 告诉jQuery不要去处理发送的数据
            contentType : false,        // 告诉jQuery不要去设置Content-Type请求头
            success:function(data){
                  imageName="["+data+"]";
                  sendAudio(c);
            },  
            error : function(data, status, e) {  
                alert('发送语音出错');  
            }  
           })
       }
  };
},function(e){
  console.log("请求麦克风失败");
  alert("未检测到麦克风");
});
<input style="display:none" value="录音" type="button" id="record" />
     <form id="imageForm" name="form" action="" enctype="multipart/form-data" method="POST" >  
        <input style="display:none" id="fileToUpload" type="file" size="45" name="fileToUpload" accept="image/*;capture=camera">  
     </form>  
原文地址:https://www.cnblogs.com/mybug/p/5884319.html