httpclient 上传图片怎么实现多文件上传 c/s java

Java:使用HttpClient进行POST和GET请求以及文件上传和下载
1.HttpClient大家可以先看一下HttpClient的介绍,这篇博文写的还算不错:http://blog.csdn.net/wangpeng047/article/details/当然,详细的文档,你可以去官方网站查看和下载:http://hc.apache.org/httpclient-3.x/2.本博客简单介绍一下POST和GET以及文件下载的应用。代码如下:package net.
import java.io.ByteArrayOutputS
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import java.util.ArrayL
import java.util.L
import java.util.M
import java.util.S
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import org.apache.http.HttpE
import org.apache.http.NameValueP
import org.apache.http.client.entity.UrlEncodedFormE
import org.apache.http.client.methods.CloseableHttpR
import org.apache.http.client.methods.HttpG
import org.apache.http.client.methods.HttpP
import org.apache.http.entity.ContentT
import org.apache.http.entity.mime.MultipartEntityB
import org.apache.http.entity.mime.content.FileB
import org.apache.http.entity.mime.content.StringB
import org.apache.http.impl.client.CloseableHttpC
import org.apache.http.impl.client.HttpC
import org.apache.http.message.BasicNameValueP
import org.apache.http.util.EntityU
* @web http://www.mobctrl.net
* @author Zheng Haibo
* @Description: 文件下载 POST GET
public class HttpClientUtils {
* 最大线程池
public static final int THREAD_POOL_SIZE = 5;
public interface HttpClientDownLoadProgress {
public void onProgress(int progress);
private static HttpClientUtils httpClientD
private ExecutorService downloadExcutorS
private HttpClientUtils() {
downloadExcutorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
public static HttpClientUtils getInstance() {
if (httpClientDownload == null) {
httpClientDownload = new HttpClientUtils();
return httpClientD
* 下载文件
* @param url
* @param filePath
public void download(final String url, final String filePath) {
downloadExcutorService.execute(new Runnable() {
public void run() {
httpDownloadFile(url, filePath, null, null);
* 下载文件
* @param url
* @param filePath
* @param progress
public void download(final String url, final String filePath,
final HttpClientDownLoadProgress progress) {
downloadExcutorService.execute(new Runnable() {
public void run() {
httpDownloadFile(url, filePath, progress, null);
* 下载文件
* @param url
* @param filePath
private void httpDownloadFile(String url, String filePath,
HttpClientDownLoadProgress progress, Map&String, String& headMap) {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
setGetHead(httpGet, headMap);
CloseableHttpResponse response1 = httpclient.execute(httpGet);
System.out.println(response1.getStatusLine());
HttpEntity httpEntity = response1.getEntity();
long contentLength = httpEntity.getContentLength();
InputStream is = httpEntity.getContent();
// 根据InputStream 下载文件
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int r = 0;
long totalRead = 0;
while ((r = is.read(buffer)) & 0) {
output.write(buffer, 0, r);
totalRead +=
if (progress != null) {// 回调进度
progress.onProgress((int) (totalRead * 100 / contentLength));
FileOutputStream fos = new FileOutputStream(filePath);
output.writeTo(fos);
output.flush();
output.close();
fos.close();
EntityUtils.consume(httpEntity);
} finally {
response1.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
* @param url
public String httpGet(String url) {
return httpGet(url, null);
* http get请求
* @param url
public String httpGet(String url, Map&String, String& headMap) {
String responseContent =
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response1 = httpclient.execute(httpGet);
setGetHead(httpGet, headMap);
System.out.println(response1.getStatusLine());
HttpEntity entity = response1.getEntity();
responseContent = getRespString(entity);
System.out.println(&debug:& + responseContent);
EntityUtils.consume(entity);
} finally {
response1.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
return responseC
public String httpPost(String url, Map&String, String& paramsMap) {
return httpPost(url, paramsMap, null);
* http的post请求
* @param url
* @param paramsMap
public String httpPost(String url, Map&String, String& paramsMap,
Map&String, String& headMap) {
String responseContent =
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
setPostHead(httpPost, headMap);
setPostParams(httpPost, paramsMap);
CloseableHttpResponse response = httpclient.execute(httpPost);
System.out.println(response.getStatusLine());
HttpEntity entity = response.getEntity();
responseContent = getRespString(entity);
EntityUtils.consume(entity);
} finally {
response.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println(&responseContent = & + responseContent);
return responseC
* 设置POST的参数
* @param httpPost
* @param paramsMap
* @throws Exception
private void setPostParams(HttpPost httpPost, Map&String, String& paramsMap)
throws Exception {
if (paramsMap != null && paramsMap.size() & 0) {
List&NameValuePair& nvps = new ArrayList&NameValuePair&();
Set&String& keySet = paramsMap.keySet();
for (String key : keySet) {
nvps.add(new BasicNameValuePair(key, paramsMap.get(key)));
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
* 设置http的HEAD
* @param httpPost
* @param headMap
private void setPostHead(HttpPost httpPost, Map&String, String& headMap) {
if (headMap != null && headMap.size() & 0) {
Set&String& keySet = headMap.keySet();
for (String key : keySet) {
httpPost.addHeader(key, headMap.get(key));
* 设置http的HEAD
* @param httpGet
* @param headMap
private void setGetHead(HttpGet httpGet, Map&String, String& headMap) {
if (headMap != null && headMap.size() & 0) {
Set&String& keySet = headMap.keySet();
for (String key : keySet) {
httpGet.addHeader(key, headMap.get(key));
* 上传文件
* @param serverUrl
服务器地址
* @param localFilePath
本地文件路径
* @param serverFieldName
* @param params
* @throws Exception
public String uploadFileImpl(String serverUrl, String localFilePath,
String serverFieldName, Map&String, String& params)
throws Exception {
String respStr =
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(serverUrl);
FileBody binFileBody = new FileBody(new File(localFilePath));
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder
.create();
// add the file params
multipartEntityBuilder.addPart(serverFieldName, binFileBody);
// 设置上传的其他参数
setUploadParams(multipartEntityBuilder, params);
HttpEntity reqEntity = multipartEntityBuilder.build();
httppost.setEntity(reqEntity);
CloseableHttpResponse response = httpclient.execute(httppost);
System.out.println(response.getStatusLine());
HttpEntity resEntity = response.getEntity();
respStr = getRespString(resEntity);
EntityUtils.consume(resEntity);
} finally {
response.close();
} finally {
httpclient.close();
System.out.println(&resp=& + respStr);
return respS
* 设置上传文件时所附带的其他参数
* @param multipartEntityBuilder
* @param params
private void setUploadParams(MultipartEntityBuilder multipartEntityBuilder,
Map&String, String& params) {
if (params != null && params.size() & 0) {
Set&String& keys = params.keySet();
for (String key : keys) {
multipartEntityBuilder
.addPart(key, new StringBody(params.get(key),
ContentType.TEXT_PLAIN));
* 将返回结果转化为String
* @param entity
* @throws Exception
private String getRespString(HttpEntity entity) throws Exception {
if (entity == null) {
InputStream is = entity.getContent();
StringBuffer strBuf = new StringBuffer();
byte[] buffer = new byte[4096];
int r = 0;
while ((r = is.read(buffer)) & 0) {
strBuf.append(new String(buffer, 0, r, &UTF-8&));
return strBuf.toString();
我们可以使用如下代码进行测试:import java.util.HashM
import java.util.LinkedHashM
import java.util.M
import net.mobctrl.HttpClientU
import net.mobctrl.HttpClientUtils.HttpClientDownLoadP
* @date 日 下午1:49:50
* @author Zheng Haibo
* @Description: 测试
public class Main {
public static void main(String[] args) {
* 测试下载文件 异步下载
HttpClientUtils.getInstance().download(
&/phone.png&, &test.png&,
new HttpClientDownLoadProgress() {
public void onProgress(int progress) {
System.out.println(&download progress = & + progress);
// POST 同步方法
Map&String, String& params = new HashMap&String, String&();
params.put(&username&, &admin&);
params.put(&password&, &admin&);
HttpClientUtils.getInstance().httpPost(
&http://192.168.31.183:8080/SSHMySql/register&, params);
// GET 同步方法
HttpClientUtils.getInstance().httpGet(
&/weather_mini?city=北京&);
// 上传文件 POST 同步方法
Map&String,String& uploadParams = new LinkedHashMap&String, String&();
uploadParams.put(&userImageContentType&, &image&);
uploadParams.put(&userImageFileName&, &testaa.png&);
HttpClientUtils.getInstance().uploadFileImpl(
&http://192.168.31.183:8080/SSHMySql/upload&, &android_bug_1.png&,
&userImage&, uploadParams);
} catch (Exception e) {
e.printStackTrace();
运行结果为:HTTP/1.1 200 OK
responseContent = {&id&:&-2&,&msg&:&添加失败!用户名已经存在!&}
HTTP/1.1 200 OK
download progress = 6
download progress = 11
download progress = 13
download progress = 20
download progress = 22
download progress = 26
download progress = 31
download progress = 33
download progress = 35
download progress = 38
download progress = 40
download progress = 42
download progress = 44
download progress = 49
download progress = 53
download progress = 55
download progress = 57
download progress = 60
download progress = 62
download progress = 64
download progress = 66
download progress = 71
download progress = 77
download progress = 77
download progress = 80
download progress = 82
HTTP/1.1 200 OK
debug:{&desc&:&OK&,&status&:1000,&data&:{&wendu&:&3&,&ganmao&:&昼夜温差很大,易发生感冒,请注意适当增减衣服,加强自我防护避免感冒。&,&forecast&:[{&fengxiang&:&无持续风向&,&fengli&:&微风级&,&high&:&高温 6℃&,&type&:&晴&,&low&:&低温 -6℃&,&date&:&22日星期四&},{&fengxiang&:&无持续风向&,&fengli&:&微风级&,&high&:&高温 6℃&,&type&:&多云&,&low&:&低温 -3℃&,&date&:&23日星期五&},{&fengxiang&:&无持续风向&,&fengli&:&微风级&,&high&:&高温 5℃&,&type&:&多云&,&low&:&低温 -3℃&,&date&:&24日星期六&},{&fengxiang&:&无持续风向&,&fengli&:&微风级&,&high&:&高温 5℃&,&type&:&阴&,&low&:&低温 -2℃&,&date&:&25日星期天&},{&fengxiang&:&无持续风向&,&fengli&:&微风级&,&high&:&高温 4℃&,&type&:&多云&,&low&:&低温 -2℃&,&date&:&26日星期一&}],&yesterday&:{&fl&:&3-4级&,&fx&:&北风&,&high&:&高温 5℃&,&type&:&晴&,&low&:&低温 -6℃&,&date&:&21日星期三&},&aqi&:&124&,&city&:&北京&}}
download progress = 84
download progress = 86
download progress = 88
download progress = 91
download progress = 93
download progress = 95
download progress = 99
download progress = 100
HTTP/1.1 200 OK
resp={&error_code&:2000,&msg&:&OK&,&filepath&:&uploadfiles/192.168.31.72_android_bug_1.png&}
下载过程有进度回调。相关的libs包,可以在如下链接中下载:http://download.csdn.net/detail/nuptboyzhb/8362801上述代码,既可以在J2SE,J2EE中使用,也可以在Android中使用,在android中使用时,需要相关的权限。另外,测试所使用的Web项目为:/nuptboyzhb/SSHMySQLDemo未经允许不得用于商业目的
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
简单的文件上传是将整个文件在一起此请求中将文件上传至服务器中,而对户外作业平台而言,网络的稳定性是一个问题,加之平台的大文件性,故而在该平台中采用断点续传方式来上传文件较为合适.断点续传简单来讲,客户端与服务器端通信,了解到已传输文件的大小后,而后在按照一定的文件块大小对剩余未传输的文件进行分块传输,服务器端则将这些块文件一点点写入到同一个文件中,从而形成一 ...
实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式 package com.cloudpower. import java.io.F import java.io.FileInputS import java. ...
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请 求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件 ...
文件上传和文件下载是我们在web应用程序中常用的两个功能,在java中,实现这两种功能的方式也有很多种,其中struts2就给我们提供了一种算是比较简单的方式吧,下面我们就一起来看一下,首先我们来看文件上传:
文件上传我们首先应该注意的是在上传页面的表单,这个表单也是有讲究的,由于我们提交表 ...
今天,又一次看到了java的文件上传和下载的实例,总感觉,有一个万能的上传和下载组件多好,就在网上搜搜了,果然在本站的同仁,太牛逼,写了一个JSP的通用上传和下载,个人认为很好,其实吧,上传和下载和原理都是一样的,每次写的时候,都是拷贝,而且会有错误,更改起来很是头痛!下面我就总结一些不错的java的文件上传和下载的文章,在下载用到的时候,拿来参考提高效率, ...
文件上传和下载的原理 设置将表单的两个属性的:method=&post&,enctype=&multipart/form-data&,让表单以二进制编码的方式提交数据.在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容从而实现文件的上传. 文件的下载需要以下的几个步骤:①通过HttpServl ...
问题描述:通常应用服务器与文件服务器分别在不同的机器上,涉及到文件的上传与下载.通过建立网络映射盘的形式,将文件服务器保存文件的文件夹映射到应用服务器的某个盘符下,经过试验,在tomcat下两台笔记本是可以实现的,但是在生产环境的websphere下试验,经过多番尝试,仍然实现不了. 问题分析:采用FTP的方式实现文件的上传与下载功能,在Java代码中编写客 ...
实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式,),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现.第一种方式[java] view plaincopyprint? package com.cloudpower.
import java.io.F
import java.i ...10803人阅读
Socket编程(23)
& & & & 本博客介绍如何进行文件的分块上传。本文侧重介绍客户端,服务器端请参考博客《》。建议读者朋友在阅读本文代码前先了解一下 MIME 协议。
& & & & 所谓分块上传并非把大文件进行物理分块,然后挨个上传,而是依次读取大文件的一部分文件流进行上传。分块,倒不如说分流比较切实。本文通过一个项目中的示例,说明使用 Apache 的 HttpComponents/HttpClient 对大文件进行分块上传的过程。示例使用的版本是 HttpComponents Client 4.2.1。
& & & & 本文仅以一小 demo 功能性地解释 HttpComponents/HttpClient 分块上传,没有考虑 I/O 关闭、多线程等资源因素,读者可以根据自己的项目酌情处理。
& & & & 本文核心思想及流程:以 100 MB 大小为例,大于 100 MB 的进行分块上传,否则整块上传。对于大于 100 MB 的文件,又以 100 MB 为单位进行分割,保证每次以不大于 100 MB 的大小进行上传。比如 304 MB 的一个文件会分为 100 MB、100 MB、100 MB、4 MB 等四块依次上传。第一次读取 0 字节开始的 100 MB 个字节,上传;第二次读取第 100 MB 字节开始的 100 MB 个字节,上传;第三次读取第 200 MB 字节开始的 100 MB
个字节,上传;第四次读取最后剩下的 4 MB 个字节进行上传。
& & & & 自定义的 ContentBody 源码如下,其中定义了流的读取和输出:
package com.mon.util.
import java.io.F
import java.io.IOE
import java.io.OutputS
import java.io.RandomAccessF
import org.apache.http.entity.mime.content.AbstractContentB
import com.defonds.rtupload.GlobalC
public class BlockStreamBody extends AbstractContentBody {
//给MultipartEntity看的2个参数
private long blockSize = 0;//本次分块上传的大小
private String fileName =//上传文件名
//writeTo需要的3个参数
private int blockNumber = 0, blockIndex = 0;//blockNumber分块数;blockIndex当前第几块
private File targetFile =//要上传的文件
private BlockStreamBody(String mimeType) {
super(mimeType);
// TODO Auto-generated constructor stub
* 自定义的ContentBody构造子
* @param blockNumber分块数
* @param blockIndex当前第几块
* @param targetFile要上传的文件
public BlockStreamBody(int blockNumber, int blockIndex, File targetFile) {
this(&application/octet-stream&);
this.blockNumber = blockN//blockNumber初始化
this.blockIndex = blockI//blockIndex初始化
this.targetFile = targetF//targetFile初始化
this.fileName = targetFile.getName();//fileName初始化
//blockSize初始化
if (blockIndex & blockNumber) {//不是最后一块,那就是固定大小了
this.blockSize = GlobalConstant.CLOUD_API_LOGON_SIZE;
} else {//最后一块
this.blockSize = targetFile.length() - GlobalConstant.CLOUD_API_LOGON_SIZE * (blockNumber - 1);
public void writeTo(OutputStream out) throws IOException {
byte b[] = new byte[1024];//暂存容器
RandomAccessFile raf
= new RandomAccessFile(targetFile, &r&);//负责读取数据
if (blockIndex == 1) {//第一块
int n = 0;
long readLength = 0;//记录已读字节数
while (readLength &= blockSize - 1024) {//大部分字节在这里读取
n = raf.read(b, 0, 1024);
readLength += 1024;
out.write(b, 0, n);
if (readLength &= blockSize) {//余下的不足 1024 个字节在这里读取
n = raf.read(b, 0, (int)(blockSize - readLength));
out.write(b, 0, n);
} else if (blockIndex & blockNumber) {//既不是第一块,也不是最后一块
raf.seek(GlobalConstant.CLOUD_API_LOGON_SIZE * (blockIndex - 1));//跳过前[块数*固定大小 ]个字节
int n = 0;
long readLength = 0;//记录已读字节数
while (readLength &= blockSize - 1024) {//大部分字节在这里读取
n = raf.read(b, 0, 1024);
readLength += 1024;
out.write(b, 0, n);
if (readLength &= blockSize) {//余下的不足 1024 个字节在这里读取
n = raf.read(b, 0, (int)(blockSize - readLength));
out.write(b, 0, n);
} else {//最后一块
raf.seek(GlobalConstant.CLOUD_API_LOGON_SIZE * (blockIndex - 1));//跳过前[块数*固定大小 ]个字节
int n = 0;
while ((n = raf.read(b, 0, 1024)) != -1) {
out.write(b, 0, n);
//TODO 最后不要忘掉关闭out/raf
public String getCharset() {
// TODO Auto-generated method stub
public String getTransferEncoding() {
// TODO Auto-generated method stub
return &binary&;
public String getFilename() {
// TODO Auto-generated method stub
return fileN
public long getContentLength() {
// TODO Auto-generated method stub
return blockS
& & & & 在自定义的 HttpComponents/HttpClient 工具类 HttpClient4Util 里进行分块上传的封装:
public static String restPost(String serverURL, File targetFile,Map&String, String& mediaInfoMap){
String content =&&;
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(serverURL +&?&);
httpClient.getParams().setParameter(&http.socket.timeout&,60*60*1000);
MultipartEntity mpEntity = new MultipartEntity();
List&String& keys = new ArrayList&String&(mediaInfoMap.keySet());
Collections.sort(keys, String.CASE_INSENSITIVE_ORDER);
for (Iterator&String& iterator = keys.iterator(); iterator.hasNext();) {
String key = iterator.next();
if (StringUtils.isNotBlank(mediaInfoMap.get(key))) {
mpEntity.addPart(key, new StringBody(mediaInfoMap.get(key)));
if(targetFile!=null&&targetFile.exists()){
ContentBody contentBody = new FileBody(targetFile);
mpEntity.addPart(&file&, contentBody);
post.setEntity(mpEntity);
HttpResponse response = httpClient.execute(post);
content = EntityUtils.toString(response.getEntity());
httpClient.getConnectionManager().shutdown();
} catch (Exception e) {
e.printStackTrace();
System.out.println(&=====RequestUrl==========================\n&
+getRequestUrlStrRest(serverURL, mediaInfoMap).replaceAll(&&fmt=json&, &&));
System.out.println(&=====content==========================\n&+content);
return content.trim();
& & & & 其中 &file& 是分块上传服务器对分块文件参数定义的名字。细心的读者会发现,整块文件上传直接使用 Apache 官方的&InputStreamBody,而分块才使用自定义的&BlockStreamBody。
& & & & 最后调用 HttpClient4Util 进行上传:
public static Map&String, String& uploadToDrive(
Map&String, String& params, String domain) {
File targetFile = new File(params.get(&filePath&));
long targetFileSize = targetFile.length();
int mBlockNumber = 0;
if (targetFileSize & GlobalConstant.CLOUD_API_LOGON_SIZE) {
mBlockNumber = 1;
mBlockNumber = (int) (targetFileSize / GlobalConstant.CLOUD_API_LOGON_SIZE);
long someExtra = targetFileSize
% GlobalConstant.CLOUD_API_LOGON_SIZE;
if (someExtra & 0) {
mBlockNumber++;
params.put(&blockNumber&, Integer.toString(mBlockNumber));
if (domain != null) {
LOG.debug(&Drive---domain=& + domain);
LOG.debug(&drive---url=& + &http://& + domain + &/sync&
+ GlobalConstant.CLOUD_API_PRE_UPLOAD_PATH);
LOG.debug(&Drive---domain=null&);
String responseBodyStr = HttpClient4Util.getRest(&http://& + domain
+ &/sync& + GlobalConstant.CLOUD_API_PRE_UPLOAD_PATH, params);
ObjectMapper mapper = new ObjectMapper();
result = mapper.readValue(responseBodyStr, ArcDrivePreInfo.class);
} catch (IOException e) {
LOG.error(&Drive.preUploadToArcDrive error.&, e);
throw new RtuploadException(GlobalConstant.ERROR_CODE_13001);// TODO
// JSONObject jsonObject = JSONObject.fromObject(responseBodyStr);
if (Integer.valueOf(result.getRc()) == 0) {
int uuid = result.getUuid();
String upsServerUrl = result.getUploadServerUrl().replace(&https&,
if (uuid != -1) {
upsServerUrl = upsServerUrl
+ GlobalConstant.CLOUD_API_UPLOAD_PATH;
params.put(&uuid&, String.valueOf(uuid));
for (int i = 1; i &= mBlockN i++) {
params.put(&blockIndex&, && + i);
HttpClient4Util.restPostBlock(upsServerUrl, targetFile,
params);//
throw new RtuploadException(GlobalConstant.ERROR_CODE_13001);// TODO
& & & & 其中 params 这个 Map 里封装的是服务器分块上传所需要的一些参数,而上传块数也在这里进行确定。
& & & & 本文中的示例经本人测试能够上传大文件成功,诸如 *.mp4 的文件上传成功没有出现任何问题。如果读者朋友测试时遇到问题无法上传成功,请在博客后跟帖留言,大家共同交流下。本文示例肯定还存在很多不足之处,如果读者朋友发现还请留言指出,笔者先行谢过了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2196095次
积分:23840
积分:23840
排名:第167名
原创:222篇
转载:51篇
译文:121篇
评论:1217条
(1)(1)(1)(3)(7)(4)(3)(5)(10)(10)(2)(2)(5)(3)(4)(4)(7)(4)(2)(1)(1)(6)(6)(4)(3)(4)(2)(21)(10)(3)(3)(5)(4)(1)(1)(3)(5)(3)(1)(1)(1)(1)(1)(3)(5)(15)(10)(1)(1)(2)(1)(2)(4)(3)(2)(1)(2)(1)(1)(1)(1)(3)(1)(1)(2)(1)(5)(5)(4)(4)(5)(1)(3)(11)(7)(7)(13)(10)(13)(1)(4)(6)(14)(16)(25)(1)(1)(1)(1)(1)(1)(1)}

我要回帖

更多关于 asynchttpclient 上传 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信