java中远程http文件上传及file2multipartfile

java

    工作中有时会遇到各种需求,你得变着法儿去解决,当然重要的是在什么场景中去完成。

比如Strut2中file类型如何转换成multipartfile类型,找了几天,发现一个变通的方法记录如下(虽然最后没有用上。。):

 1 private static MultipartFile getMulFileByPath(String picPath) {  

2

3 FileItem fileItem = createFileItem(picPath);

4

5 MultipartFile mfile = new CommonsMultipartFile(fileItem);

6

7 return mfile;

8

9 }

10

11

12

13 private static FileItem createFileItem(String filePath)

14

15 {

16

17 FileItemFactory factory = new DiskFileItemFactory(16, null);

18

19 String textFieldName = "textField";

20

21 int num = filePath.lastIndexOf(".");

22

23 String extFile = filePath.substring(num);

24

25 FileItem item = factory.createItem(textFieldName, "text/plain", true,

26

27 "MyFileName" + extFile);

28

29 File newfile = new File(filePath);

30

31 int bytesRead = 0;

32

33 byte[] buffer = new byte[4096];

34

35 try

36

37 {

38

39 FileInputStream fis = new FileInputStream(newfile);

40

41 OutputStream os = item.getOutputStream();

42

43 while ((bytesRead = fis.read(buffer, 0, 8192))

44

45 != -1)

46

47 {

48

49 os.write(buffer, 0, bytesRead);

50

51 }

52

53 os.close();

54

55 fis.close();

56

57 }

58

59 catch (IOException e)

60

61 {

62

63 e.printStackTrace();

64

65 }

66

67 return item;

68

69 }

file2multipartfile

    好不容易写好了一个完整的远程上传方法,并且本地测试已经通过能用,提交后发现有个类实例化不了,debug发现是包不兼容问题(尴尬),

但是以前别人用过的东西,你又不能升级,主要是没权限,不得不去低级的版本中找变通的类似方法,即便方法已经过时了。。

//httpclient(4.5.3)远程传输文件工具类

  1 public static Map<String, String> executeDriverServer(String driverUrl, Map<String, Object> param,String multipart, String contentType,int timeout,String picPath) throws Exception {

2

3 String res = ""; // 请求返回默认的支持json串

4

5 Map<String, String> map = new HashMap<String, String>();

6 ContentType ctype = ContentType.create("content-disposition","UTF-8");

7

8 Map<String, String> map = new HashMap<String, String>();

9

10 HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();

11

12 CloseableHttpClient closeableHttpClient = httpClientBuilder.build();

13

14 String res = ""; // 请求返回默认的支持json串

15

16 HttpResponse httpResponse = null;

17

18 try {

19

20 HttpPost httpPost = new HttpPost(driverUrl);

21

22 //设置请求和传输超时时间

23

24 RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout).setConnectTimeout(5000).build();

25

26 httpPost.setConfig(requestConfig);

27

28 // BTW 4.3版本不设置超时的话,一旦服务器没有响应,等待时间N久(>24小时)。

29

30 if(httpPost!=null){

31

32 if("formdata".equals(multipart)){

33

34 MultipartEntityBuilder mentity = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);

35

36 Set<String> keyset = param.keySet();

37

38 for (String key : keyset) {

39

40 Object paramObj = Validate.notNull(param.get(key));

41

42 if(paramObj instanceof MultipartFile) {

43

44 mentity.addBinaryBody(key, ((MultipartFile) paramObj).getInputStream(),ctype,((MultipartFile) paramObj).getOriginalFilename());

45

46 }else if(paramObj instanceof File){

47

48 mentity.addBinaryBody(key, (File)paramObj);//(key, new FileInputStream((File)paramObj),ctype,((File)paramObj).getName());

49

50 }else{

51

52 mentity.addPart(key,new StringBody(paramObj.toString(),ctype));

53

54 //mentity.addTextBody(key,paramObj.toString());

55

56 }

57

58 logger.info("key::::"+key);

59

60 logger.info("paramObj::::"+paramObj.toString());

61

62 }

63

64 HttpEntity entity = mentity.build();

65

66 HttpUriRequest post = RequestBuilder.post().setUri(driverUrl).setEntity(entity).build();

67

68 httpResponse = closeableHttpClient.execute(post);

69

70 }else {

71

72 HttpEntity entity = convertParam(param, contentType);

73

74 httpPost.setEntity(entity);

75

76 httpResponse = closeableHttpClient.execute(httpPost);

77

78 }

79

80 if(httpResponse == null) {

81

82 throw new Exception("无返回结果");

83

84 }

85

86 // 获取返回的状态码

87

88 int status = httpResponse.getStatusLine().getStatusCode();

89

90 logger.info("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",状态="+status);

91

92 if(status == HttpStatus.SC_OK){

93

94 HttpEntity entity2 = httpResponse.getEntity();

95

96 InputStream ins = entity2.getContent();

97

98 res = toString(ins);

99

100 ins.close();

101

102 }else{

103

104 InputStream fis = httpResponse.getEntity().getContent();

105

106 Scanner sc = new Scanner(fis);

107

108 logger.info("Scanner:::::"+sc.next());

109

110 logger.error("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",错误Code:"+status);

111

112 }

113

114 map.put("code", String.valueOf(status));

115

116 map.put("result", res);

117

118 logger.info("执行Post方法请求返回的结果 = " + res);

119

120 }

121

122 } catch (ClientProtocolException e) {

123

124 map.put("code", HttpClientUtil.CLIENT_PROTOCOL_EXCEPTION_STATUS);

125

126 map.put("result", e.getMessage());

127

128 } catch (UnsupportedEncodingException e) {

129

130 map.put("code", HttpClientUtil.UNSUPPORTED_ENCODING_EXCEPTION_STATUS);

131

132 map.put("result", e.getMessage());

133

134 } catch (IOException e) {

135

136 map.put("code", HttpClientUtil.IO_EXCEPTION_STATUS);

137

138 map.put("result", e.getMessage());

139

140 } finally {

141

142 try {

143

144 closeableHttpClient.close();

145

146 } catch (IOException e) {

147

148 logger.error("调用httpClient出错", e);

149

150 throw new Exception("调用httpClient出错", e);

151

152 }

153

154 }

155

156

157

158 private static String toString(InputStream in) throws IOException{

159

160 ByteArrayOutputStream os = new ByteArrayOutputStream();

161

162 byte[] b = new byte[1024];

163

164 int len;

165

166 while((len = in.read(b)) != -1) {

167

168 os.write(b, 0, len);

169

170 }

171

172 return os.toString("UTF-8");

173

174 }

175 }

4.53包下http远程文件上传

//httpclient(4.2.2)老版本远程传输文件工具类

 1 public static Map<String, String> executeDriverServer(String driverUrl, Map<String, Object> param,String multipart, String contentType,int timeout,String picPath) throws Exception {

2

3 String res = ""; // 请求返回默认的支持json串

4

5 Map<String, String> map = new HashMap<String, String>();

6

7 ContentType ctype = ContentType.create("content-disposition","UTF-8");

8

9 HttpPost httpPost = new HttpPost(driverUrl);

10

11 MultipartEntity reqEntity = new MultipartEntity();

12

13 Set<String> keyset = param.keySet();

14

15 File tempFile = new File(picPath);

16

17 for (String key : keyset) {

18

19 Object paramObj = Validate.notNull(param.get(key));

20

21 if(paramObj instanceof File) {

22

23 FileBody fileBody = new FileBody(tempFile);

24

25 reqEntity.addPart(key, fileBody);

26

27 }else{

28

29 reqEntity.addPart(key,new StringBody(paramObj.toString()));

30

31 }

32

33 logger.info("key::::"+key);

34

35 logger.info("paramObj::::"+paramObj.toString());

36

37 }

38

39 httpPost.setEntity(reqEntity);

40

41 HttpClient httpClient = new DefaultHttpClient();

42

43 HttpResponse httpResponse = httpClient.execute(httpPost);

44

45 // 获取返回的状态码

46

47 int status = httpResponse.getStatusLine().getStatusCode();

48

49 logger.info("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",状态="+status);

50

51 if(status == HttpStatus.SC_OK){

52

53 HttpEntity entity2 = httpResponse.getEntity();

54

55 InputStream ins = entity2.getContent();

56

57 res = toString(ins);

58

59 ins.close();

60

61 }else{

62

63 InputStream fis = httpResponse.getEntity().getContent();

64

65 Scanner sc = new Scanner(fis);

66

67 logger.info("Scanner:::::"+sc.next());

68

69 logger.error("Post请求URL="+driverUrl+",请求的参数="+param.toString()+",请求的格式"+contentType+",错误Code:"+status);

70

71 }

72

73 map.put("code", String.valueOf(status));

74

75 map.put("result", res);

76

77 logger.info("执行Post方法请求返回的结果 = " + res);

78

79 return map;

80

81 }

4.2.2版本http远程传输文件工具类

    希望对大家有点帮助!平常心。

以上是 java中远程http文件上传及file2multipartfile 的全部内容, 来源链接: utcz.com/z/391337.html

回到顶部