浏览代码

修复文件下载流URL参数中包含中文URL编码不正确导致HTTP-400异常

陈精华 5 年之前
父节点
当前提交
11d6ad1ed3
共有 1 个文件被更改,包括 25 次插入20 次删除
  1. 25 20
      jodconverter-web/src/main/java/cn/keking/utils/DownloadUtils.java

+ 25 - 20
jodconverter-web/src/main/java/cn/keking/utils/DownloadUtils.java

@@ -123,30 +123,35 @@ public class DownloadUtils {
      * 对最有一个路径进行转码
      * @param urlAddress
      *          http://192.168.2.111:8013/demo/Handle中文.zip
+     *          http://192.168.2.111:8013/download?id=1&filename=中文.zip
      * @return
      */
-    private String encodeUrlParam(String urlAddress) {
-        String newUrl = "";
-        try {
-            String path = "";
-            String param = "";
-            if (urlAddress.contains("?")) {
-                path = urlAddress.substring(0, urlAddress.indexOf("?"));
-                param = urlAddress.substring(urlAddress.indexOf("?"));
-            }else {
-                path = urlAddress;
-            }
-            String lastPath = path.substring(path.lastIndexOf("/") + 1);
-            String leftPath = path.substring(0, path.lastIndexOf("/") + 1);
-            String encodeLastPath = URLEncoder.encode(lastPath, "UTF-8");
-            newUrl += leftPath + encodeLastPath;
-            if (urlAddress.contains("?")) {
-                newUrl += param;
+
+    private String encodeUrlParam(String urlAddress){
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < urlAddress.length(); i++) {
+            char c = urlAddress.charAt(i);
+            if (c >= 0 && c <= 255) {
+                sb.append(c);
+            } else {
+                byte[] b;
+                try {
+                    //指定需要的编码类型
+                    b = String.valueOf(c).getBytes("utf-8");
+                } catch (Exception ex) {
+                    System.out.println(ex);
+                    b = new byte[0];
+                }
+                for (int j = 0; j < b.length; j++) {
+                    int k = b[j];
+                    if (k < 0) {
+                        k += 256;
+                    }
+                    sb.append("%" + Integer.toHexString(k).toUpperCase());
+                }
             }
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
         }
-        return newUrl;
+        return sb.toString();
     }