SpringMVC結合Ajaxfileupload異步多文件上傳至遠程服務器
項目中我們可能會使用到異步上傳并且有時需要是異步的,那么Ajaxfileupload是一個不錯的選擇,最近剛 做了一個多文件上傳到遠程服務器,遠程服務器提供接口,當遠程服務器上傳結束后返回一個文件的服務器地址。分享出來給有需要的參考 下,Ajaxfileupload默認是一次只能上傳一個文件的,所以需要稍稍修改下他的源碼就可以上傳多個文件,這里就不多說,百度一下自然就知道。
<input type="file" id="playeraddress" name="playeraddress" /> <input type="file" id="cover" name="cover" /> //這里就是兩個file id自己定義
$.ajaxFileUpload({ url : web_path+'upload/upload.do', secureuri : false, data : data,//需要傳遞的數據 json格式 fileElementId :['playeraddress','cover'], dataType : 'json', success : function(data) { //上傳成功后的回調。 }, error : function(data) { } });
/* @param request @param response @param audioItem @return / @RequestMapping(value = "/upload.do", method = { RequestMethod.POST }) @ResponseBody public String addMusic(HttpServletRequest request, HttpServletResponse response, AudioItem audioItem) { //這里無需理會,這只是 String uploadFileUrl = GlobalUtil .getValue("upload_audioItem_audio_url"); String uploadIconUrl = GlobalUtil.getValue("upload_audioItem_pic_url");CommonsMultipartResolver resolver = new CommonsMultipartResolver( request.getServletContext()); if (resolver.isMultipart(request)) { MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; // 取得request中的所有文件名 Iterator<String> iter = multiRequest.getFileNames(); while (iter.hasNext()) { String fileName = iter.next(); // 取得上傳文件 MultipartFile file = multiRequest.getFile(fileName); /* 獲取文件名 */ String originalFilename = file.getOriginalFilename(); if ("playeraddress".equals(fileName)&&!"".equals(originalFilename)) { try { //這里的upload方法就是以http post的方式上傳文件的 稍后貼出 String url = BaseService.upload(uploadFileUrl, file.getOriginalFilename(), file.getInputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if ("cover".equals(fileName)&&!"".equals(originalFilename)){ try { String icon = BaseService.upload(uploadIconUrl, file.getOriginalFilename(), file.getInputStream()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //這里需要注意 使用Ajaxfileupload需要使用以下方式返回結果 回調不了success 方法 response.setContentType("text/html"); try { response.getWriter().write("ok"); } catch (IOException e) { e.printStackTrace(); }
} return null; }</pre>
//最后一步了 public static String upload(String httpurl, String fileName, InputStream inputStream) { String result = ""; try { //這里看你的網絡環境 按需設置代理 正常都不需要理會 if (true) { System.setProperty("http.proxyHost", BaseService.PROXY_IP); System.setProperty("http.proxyPort", BaseService.PROXY_PORT); } String BOUNDARY = "---------7d4a6d158c9"; // 定義數據分隔線 URL url = new URL(httpurl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 發送POST請求必須設置如下兩行 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); OutputStream out = new DataOutputStream(conn.getOutputStream()); byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();// 定義最后數據分隔線 StringBuilder sb = new StringBuilder(); sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data;name=\"file" + 1 + "\";filename=\"" + fileName + "\"\r\n"); sb.append("Content-Type:application/octet-stream\r\n\r\n"); byte[] data = sb.toString().getBytes(); out.write(data); DataInputStream in = new DataInputStream(inputStream); int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } out.write("\r\n".getBytes()); // 多個文件時,二個文件之間加入這個 in.close(); out.write(end_data); out.flush(); out.close(); // 定義BufferedReader輸入流來讀取URL的響應 BufferedReader reader = new BufferedReader(new InputStreamReader( conn.getInputStream()));String line = null; while ((line = reader.readLine()) != null) { result+=line; } } catch (Exception e) { System.out.println("發送POST請求出現異常!" + e); } return new JSONObject(result).getString("url"); } // 到這就結束了!希望能幫到你。</pre>
來自:http://my.oschina.net/pingdy/blog/361833