SpringMVC結合Ajaxfileupload異步多文件上傳至遠程服務器

jopen 9年前發布 | 6K 次閱讀 Java SpringMVC

項目中我們可能會使用到異步上傳并且有時需要是異步的,那么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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!