当前位置:   article > 正文

通过http请求上传含中文路径文件问题解决_浏览器引入文件中文路径

浏览器引入文件中文路径

之前一直在用的是已经封装好的http工具类,公司最近接了一个二期项目,人家原来的图片含有中文路径,导致图片在从客户端往服务端传的时候一直报错!
先附上之前使用的上传文件方法:

/**
	 * 上传文件
	 * @param requestMap 双传文件的信息
	 * @param filePath
	 * @return
	 */
	public String methodUploadFile(Map<String, String> headerMap,Map<String, String> requestMap)
	{
		String urlStr = headerMap.get("requestURL");
		if(!urlStr.endsWith("?"))
		{
			urlStr = urlStr + "?" ; 
		}
		for (Iterator iterator = requestMap.entrySet().iterator(); iterator.hasNext();)
		{
			Entry me = (Entry) iterator.next();
			String key = me.getKey() + "" ; 
			String val = me.getValue() + "" ; 
			urlStr = urlStr + "&" + key + "=" + val ; 
		}
		/* 返回值 */
		StringBuffer sbRes = new StringBuffer() ; 
		String filePath = requestMap.get("filePath");
		try
		{
			// 换行符
			final String newLine = "\r\n";
			final String boundaryPrefix = "--";
			// 定义数据分隔线
			String BOUNDARY = "========7d4a6d158c9";
			// 服务器的域名
			URL url = new URL(urlStr);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			// 设置为POST请求
			conn.setRequestMethod("POST");
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setUseCaches(false);
			// 设置请求头参数
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("Charsert", "UTF-8");
			conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

			OutputStream out = new DataOutputStream(conn.getOutputStream());

			// 上传文件
			File file = new File(filePath);
			StringBuilder sb = new StringBuilder();
			sb.append(boundaryPrefix);
			sb.append(BOUNDARY);
			sb.append(newLine);
			// 文件参数,photo参数名可以随意修改
			sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + filePath + "\"" + newLine);
			sb.append("Content-Type:application/octet-stream");
			// 参数头设置完以后需要两个换行,然后才是参数内容
			sb.append(newLine);
			sb.append(newLine);

			// 将参数头的数据写入到输出流中
			out.write(sb.toString().getBytes());

			// 数据输入流,用于读取文件数据
			DataInputStream in = new DataInputStream(new FileInputStream(file));
			byte[] bufferOut = new byte[1024];
			int bytes = 0;
			// 每次读1KB数据,并且将文件数据写入到输出流中
			while ((bytes = in.read(bufferOut)) != -1)
			{
				out.write(bufferOut, 0, bytes);
			}
			// 最后添加换行
			out.write(newLine.getBytes());
			in.close();

			// 定义最后数据分隔线,即--加上BOUNDARY再加上--。
			byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine).getBytes();
			// 写上结尾标识
			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)
			{
				sbRes.append(line);
			}

		} catch (Exception e)
		{
			ConstatFinalUtil.LOGGER.error("上传文件失败了;文件名:{}",filePath , e);
		}
		return sbRes.toString() ; 
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96

刚开始一度以为是编码的问题,可是把客户端和服务端的代码都查了一遍,都有做编码和解码。可在上传的时候还是报错。
后来找到了一个上传的方法,测试可以,就封装起来用这个来上传:

public String fileUpload(Map<String, String> requestMap) throws ClientProtocolException, IOException
	{
		CloseableHttpClient httpClient = HttpClients.createDefault();

		try
		{
			// 要上传的文件的路径
			String filePath = new String(requestMap.get("filePath"));
			// 把一个普通参数和文件上传给下面这个地址 是一个servlet
			HttpPost httpPost = new HttpPost(requestMap.get("requestURL"));
			// 把文件转换成流对象FileBody
			File file = new File(filePath);
			FileBody bin = new FileBody(file);
//			StringBody userId = new StringBody("用户ID", ContentType.create("text/plain", Consts.UTF_8));
			//以浏览器兼容模式运行,防止文件名乱码。 
			//这里是放一些你要传的参数,例如验证身份的公私钥或者方法名之类的。
			HttpEntity reqEntity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE).addPart("file", bin)
					.addTextBody("name", requestMap.get("name")).addTextBody("fileName", requestMap.get("fileName")).addTextBody("jlbh", requestMap.get("jlbh")).setCharset(CharsetUtils.get("UTF-8"))
					.build();

			httpPost.setEntity(reqEntity);

			System.out.println("发起请求的页面地址 " + httpPost.getRequestLine());
			// 发起请求 并返回请求的响应
			CloseableHttpResponse response = httpClient.execute(httpPost);
			try
			{
				// 获取响应对象
				HttpEntity resEntity = response.getEntity();
				if (resEntity != null)
				{
					String resp = EntityUtils.toString(resEntity, Charset.forName("UTF-8"));
					
					return resp;
				}
				// 销毁
				EntityUtils.consume(resEntity);
			} finally
			{
				response.close();
			}
		} finally
		{
			httpClient.close();
		}
		return null;
	}
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/941373
推荐阅读
相关标签
  

闽ICP备14008679号