https+spring3+httpclient4多文件上传

本文章主要介绍使用httpclient通过HTTPS加密上传文件。
为了比较好理解,由两个工程来实现这个功能:
服务端:multiuploadserver

服务端证书生成及配置可参考我之前的博客:
[url=http://sharron5.iteye.com/blog/794818]JAVA keytool数字证书生成及应用[/url]
需要注意的是,在生成keystore时:‘CN(Common Name名字与姓氏)’ 的值必须与服务端URL中的名称一致。
比如所访问的服务器端的URL为:https://localhost:8443/test,则CN值必须为localhost。

配置完成后,就可编写服务端代码了(这部分可参考[url=http://sharron5.iteye.com/blog/794566]spring3.0多文件上传[/url])
只要在此[url=http://sharron5.iteye.com/blog/794566]spring3.0多文件上传[/url]基础上加入web.xml配置即可(这个在[url=http://sharron5.iteye.com/blog/794818]JAVA keytool数字证书生成及应用[/url]中已有说明):
<security-constraint>
<web-resource-collection>
<web-resource-name>HtmlAdaptor</web-resource-name>
<url-pattern>/</url-pattern>
</web-resource-collection>
<user-data-constraint>
<description>Protection should be CONFIDENTIAL</description>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>



客户端:multiuploadClient

客户端操作:

首先访问服务器URL(基于IE),会提示安装证书,点击‘查看证书’--》‘详细信息’--》复制到文件。将证书保存到本地。
此处导出位置为multiuploadClient工程src目录下,证书文件名为multi.cer。

然后进入命令行窗口(确定配置好了JAVA环境):
(1) cd 保存的证书所在目录
(2) 输入:keytool -import -keystore client.keystore -storepass 111111 -alias client -file multi.cer
storepass必须证书密码一致。
正确导入证书之后,就可编写代码了:
package com.client.ctl;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.security.KeyStoreException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;

public class UploadFileCtl {


HttpClient httpClient = new DefaultHttpClient();

MultipartEntity multipartEntity = new MultipartEntity();

/**
* getHttpClient
* @return
*/
public HttpClient getHttpClient() {
return httpClient;
}

/**
* getMultipartEntity
* @return
*/
public MultipartEntity getMultipartEntity() {
return multipartEntity;
}

/**
* 获得KeyStore
* @param uri
* @param storepass
* @return
*/
public KeyStore getKeyStore(String uri, String storepass) {
System.out.println("getKeyStore****************");
KeyStore keyStore = null;
try {
keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
} catch (KeyStoreException e) {
e.printStackTrace();
System.out.println("Failed to create keystore");
}
FileInputStream fis = null;
try {
fis = new FileInputStream(uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("File read exception");
}
try {
keyStore.load(fis, storepass.toCharArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return keyStore;
}

/**
* 获得SocketFactory
* @param keyStore
* @return
*/
public SocketFactory getSocketFactory(KeyStore keyStore) {
System.out.println("getSocketFactory****************");
SocketFactory socketFactory = null;
try {
socketFactory = new SSLSocketFactory(keyStore);
} catch (Exception e) {
e.printStackTrace();
}
return socketFactory;
}

/**
* 配置连接信息
* @param name
* @param SocketFactory
* @param port
*/
public void registryScheme(String name, SocketFactory SocketFactory,
int port) {
System.out.println("registryScheme****************");
Scheme scheme = new Scheme(name, SocketFactory, port);
httpClient.getConnectionManager().getSchemeRegistry().register(
scheme);
}

/**
* 获得HttpPost
* @param uri
* @return
*/
public HttpPost getHttpPost(String uri) {
System.out.println("getHttpPost****************");
HttpPost httpPost = new HttpPost(uri);
System.out.println("executing request:" + httpPost.getRequestLine());
return httpPost;
}

/**
* 添加文件主体
* @param name
* @param fileBody
*/
public void addFileBody(String[] name ,FileBody[] fileBody) {
for (int i = 0; i < name.length; i++) {
System.out.println("addContentBody:"+name[i]);
multipartEntity.addPart(name[i], fileBody[i]);
}
}

/**
* 设置请求实体multipartEntity
* @param httpPost
*/
public void setEntity(HttpPost httpPost) {
System.out.println("setEntity****************");
httpPost.setEntity(multipartEntity);
}

/**
* 执行请求
* @param httpUriRequest
* @return
*/
public HttpResponse executeRequest(HttpUriRequest httpUriRequest) {
System.out.println("executeRequest****************");
HttpResponse httpresponse = null;
try {
httpresponse = httpClient.execute(httpUriRequest);
} catch (Exception e) {
e.printStackTrace();
}
return httpresponse;
}

/**
* 关闭连接,释放所有资源
*/
public void closeConnection() {
System.out.println("closeConnection****************");
httpClient.getConnectionManager().shutdown();
}

public static void main(String[] args) {
UploadFileCtl ufc = new UploadFileCtl();
KeyStore keyStore = ufc.getKeyStore(
"G:/workspace/multiuploadClient/src/client.keystore", "111111");
SocketFactory socketFactory = ufc.getSocketFactory(keyStore);
ufc.registryScheme("https", socketFactory, 8443);
HttpPost httpPost = ufc
.getHttpPost("https://localhost:8443/multiuploadserver/multiuploadController/uploadFile");
ufc.addFileBody(
new String[]{"file","file"},
new FileBody[]{
new FileBody(new File("G:/workspace/multiuploadClient/src/multi.cer")),
new FileBody(new File("G:/workspace/multiuploadClient/src/client.keystore"))
}
);
ufc.setEntity(httpPost);

/***********************************************************************/

HttpResponse httpresponse = ufc.executeRequest(httpPost);
ufc.closeConnection();
System.out.println("\n-------------------------------------------------------------\n");
HttpEntity httpentity = httpresponse.getEntity();

System.out.println("StatusLine:" + httpresponse.getStatusLine());
if (httpentity != null) {
System.out.println("------------------Response content start------------------------");
try {
InputStream in = httpentity.getContent();
BufferedReader br = new BufferedReader(
new InputStreamReader(in));
String str;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("--------------------Response content end----------------------");
System.out.println("Response Content-Type: "
+ httpentity.getContentType());
try {
httpentity.consumeContent();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}


代码完成后,首先将multiuploadserver工程部署到JBOSS下,启动JBOSS,然后运行客户端代码即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值