问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android的自带的httpClient 怎么上传文件

发布网友 发布时间:2022-04-29 23:09

我来回答

2个回答

懂视网 时间:2022-04-21 06:51

jsp HTTPclient MultipartEntity multipart/form-data

jsp 页面上传文件代码:


httpclient 不知道怎么写,
网上查了一大堆都是你抄我我抄你的,
网上都是这么写的
jsp 代码是下面这样的


后天代码都是这样写的

MultipartEntity entity = new MultipartEntity();
entity.addPart("param1", new StringBody("中国", Charset.forName("UTF-8")));
entity.addPart("param2", new StringBody("value2", Charset.forName("UTF-8")));
entity.addPart("param3", new FileBody( new File("C:\1.txt")));

HttpPost request = new HttpPost(“http://localhost/index.html”);
request.setEntity(entity);

我就不懂了,上面的路径都是文件上传选的,他们写代码都是
entity.addPart("param3", new FileBody( new File("C:\1.txt")));
文件路径都是写死的,文件上传貌似是没有这个new File()的吧!因为代码在服务器端,怎么可能会这么写呢?
用户上传自己本地的代码是本地的路径,服务器边这边肯定是没这个地址的,

我都不知道上面这些代码他们自己都不去验证就往上写

求高手们帮帮忙,这个问题怎么解决,
服务器端的接口要的就是multipart/form-data这个数据,我该怎么写



回复讨论(解决方案)

你先搞清楚 HTTPclient 是做什么用的
HTTPclient 的作用是在 jsp 中模拟一个浏览器,即 HTTP 协议的客户端(client)
你的后台代码是将你本地服务器上的文件 像浏览器那样上传到目标服务器
于是 new File("C:\1.txt") 的问题就可以解决了吧?C:\1.txt 是你本地服务器中的文件,当然文件名是你自己定的

至于 multipart/form-data 声明,那是由 HttpPost 的参数 MultipartEntity 自动加上的

我要的就是网页上传到服务器,服务器使用HTTPclient 调用另一个服务接口上传,并不是上传我本地文件

因为这个接口规定了只能传multipart/form-data,浏览器那边会把上传的文件信息通过这边后台获取后再转向接口那边去执行保存,接口那边存放操作各自数据等

我的页面是这样的,这个窗口有上传功能,进行提交,提交到后台,后台再使用httpclient转向另一个接口服务器,需要把这些数据传过去,接口那边要的是multipart/form-data 这个文件流,我现在不知道怎么使用httpclient传过去,因为我以前没用功HTTPclient

上传功能窗口

上传请求到后台的数据


这就是传给后台的数据,现在是想要httpclient获取multipart/form-data,不知道怎么做

Request URL:http://localhost:8080/proxy/api/images/attachments/json/0/67/0/0/-1?Type=Image&CKEditor=textEditor&CKEditorFuncNum=1&langCode=zh-cn
Request Headers CAUTION: Provisional headers are shown.
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarysw8ttG9a1gakIbQt
Origin:http://localhost:8080
Referer:http://localhost:8080/user/kouht/editonline
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Query String Parametersview sourceview URL encoded
Type:Image
CKEditor:textEditor
CKEditorFuncNum:1
langCode:zh-cn
Request Payload
------WebKitFormBoundarysw8ttG9a1gakIbQt
Content-Disposition: form-data; name="upload"; filename="menu.png"
Content-Type: image/png


------WebKitFormBoundarysw8ttG9a1gakIbQt--

你浏览器上传文件是上传到你自己的服务器,你接收后在传到其他服务器时,才需要用 HTTPclient
这是接力,不要搞混了!

你浏览器上传文件是上传到你自己的服务器,你接收后在传到其他服务器时,才需要用 HTTPclient
这是接力,不要搞混了!



不能直接传到另一个服务器吗

不能!
因为浏览器上传文件结束时,jsp 才开始工作
而 HTTPclient 只是模拟了浏览器,也是文件方式上传文件
如果你想在 jsp 中一边接收上传文件的数据,一边向上级服务器发送的话
一是要你自己写文件接收程序,二是要用 socket 向上级服务器发送
涉及的知识太多,你一时半会是搞不起来的

不能!
因为浏览器上传文件结束时,jsp 才开始工作
而 HTTPclient 只是模拟了浏览器,也是文件方式上传文件
如果你想在 jsp 中一边接收上传文件的数据,一边向上级服务器发送的话
一是要你自己写文件接收程序,二是要用 socket 向上级服务器发送
涉及的知识太多,你一时半会是搞不起来的



好像是可以的,我看了下他们以前的代码,是可以的,不需要那么麻烦,他们是这么写的

下面这个方法就是我上面说的那个路径 Request URL:http://localhost:8080/proxy/api/images/attachments/json/0/67/0/0/-1?Type=Image&CKEditor=textEditor&CKEditorFuncNum=1&langCode=zh-cn
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String targerUrl =request.getRequestURI();
HttpProxy.request(request, response, targerUrl);// 代理请求
}

/**
* 代理请求
*
* @param request
* - 请求
* @param response
* - 响应
* @param targetUrl
* - 目标服务器地址
* @param encoding
* - 目标服务器的编码格式
* @return
* @throws IOException
*/
public static void request(HttpServletRequest request, HttpServletResponse response, String targetUrl) throws IOException {

// System.out.println("进入Http代理");

// 目标url
if (null == targetUrl) {
throw new IOException("缺少目标服务器地址");
}

// 目标服务器地址
String url = null;

// 获取目标服务器地址,并对目标服务器中的中文进行重新编码
try {
url = ProxyUtils.rebuildURL2(targetUrl, "utf-8");
} catch (Exception e) {
e.printStackTrace();
}

// 请求参数
Map params = new HashMap();

// 请求头部信息
Map headers = new HashMap();

// 客户端请求方式
String method = request.getMethod();

logger.info("[代理请求] method: " + method + ": " + url);

// 获取请求头部信息的枚举
Enumeration headersEnu = request.getHeaderNames();
while (headersEnu.hasMoreElements()) {
// 取得请求头部名称
String headerName = (String) headersEnu.nextElement();
String headerValue = request.getHeader(headerName);
headers.put(headerName.toLowerCase(), headerValue);
logger.info(" [header] " + headerName + "=" + headerValue);
}

// 如果有指定请求头部,就覆盖原来请求头部
if (null != headerMap && headerMap.size() > 0) {
for (String key : headerMap.keySet()) {
headers.put(key.toLowerCase(), headerMap.get(key));
}
}
// 获取参数键值名称
Enumeration enu = request.getParameterNames();
while (enu.hasMoreElements()) {
// 取得参数名称列表
String paramName = (String) enu.nextElement();
// 处理本请求参数以及发送给第三方服务器的参数
String paramValue = request.getParameter(paramName);
params.put(paramName, paramValue);
logger.info(" [参数] " + paramName + "=" + paramValue);
}

// 取得ajax代理
AjaxProxy proxy = ProxyFactory.getProxyInstance(method, url, params, headers);

// // 请求body
// String requestBody = readFileByLines(request.getInputStream());
//
// System.out.println(" [requestBody]" + requestBody);

// 获取ajax代理响应
AjaxResponse resp = null;

// 若是post请求,且属于表单上传时(multipart/form-data),传递input流
String contentType = headers.get("content-type");
boolean isUpload = null != contentType && contentType.toLowerCase().indexOf("multipart/form-data") >= 0;

// 1,当请求的资源是图片时,直接使用流作为response返回结果
String accept = headers.get("accept");
boolean useStream4response = null != accept ? (accept.indexOf("image/") >= 0) : true;

// 始终使用流作为返回值
useStream4response = true;

if ("post".equalsIgnoreCase(method) && isUpload) {
useStream4response = false;
// 期望上传图片后返回xml格式数据
headers.put("accept", "application/json");
resp = proxy.getAjaxResponse(request.getInputStream());
// } else if ( "put".equalsIgnoreCase(method) && params.size() > 0 )
// {
// // put请求, 且具有参数, 传递input流
// resp = proxy.getAjaxResponse(request.getInputStream());
} else if (useStream4response) {
OutputStream out = response.getOutputStream();
resp = proxy.getAjaxResponse(out);
out.flush();
} else {
resp = proxy.getAjaxResponse();
}

// 取得方法
HttpMessage httpMethod = resp.getMethod();

// 无响应时httpMethod为null
if (null == httpMethod) {
logger.info("[代理请求失败] http code: " + resp.getStatusCode() + ": " + url);
return;
}

// 取得响应头部
Header[] respHheaders = httpMethod.getAllHeaders();
for (int i = 0, len = respHheaders.length; i < len; i++) {
Header header = respHheaders[i];
if (!isOverrideCookie && "Set-Cookie".equalsIgnoreCase(header.getName())) {
continue;
}
if ("content-type".equalsIgnoreCase(header.getName())) {
if ("post".equalsIgnoreCase(method) && isUpload) {
// 若是上传,则不覆盖contentType
response.setCharacterEncoding("utf-8");
continue;
}
}
response.setHeader(header.getName(), header.getValue());
logger.info(" [response header] " + header.getName() + "=" + header.getValue());
}

// 输出
if (useStream4response) {
logger.info("请求地址: " + url + " -----返回结果: [Stream]");
} else {
PrintWriter out = response.getWriter();
String result = resp.getContent();
out.print(result);
}
return;
}

用这个红色的代码给上传上去了

你按他写的成功了吗?

他的思路是完全不同的,他是写了一个代理服务器
用你的服务器中站客户端请求

需要注意的是,写代理服务器时,不要窥视用户数据。这是有违职业道德的

对,这个就成功了,没有窥视,他这就是相当于把浏览器请求的信息全部拿到再去用代理请求一次,把数据原封不动的再去请求

热心网友 时间:2022-04-21 03:59

Android上传文件到服务端可以使用HttpConnection 上传文件,也可以使用Android封装好的HttpClient类。当仅仅上传文件可以直接使用httpconnection 上传比较方便快捷。

1、使用HttpConection上传文件。将文件转换成表单数据流。主要的思路就自己构造个http协议内容,服务端解析报文获得表单数据。代码片段:

[java] view plaincopy
HttpURLConnection con;
try {
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(C_TimeOut);
/* 允许Input、Output,不使用Cache */
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
/* 设置传送的method=POST */
con.setRequestMethod("POST");
/* setRequestProperty */
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);

/* 设置DataOutputStream */
DataOutputStream ds = new DataOutputStream(con.getOutputStream());
FileInputStream fStream = new FileInputStream(file);

/* 设置每次写入1024bytes */
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];

int length = -1;
/* 从文件读取数据至缓冲区 */
while((length = fStream.read(buffer)) != -1)
{
/* 将资料写入DataOutputStream中 */
ds.write(buffer, 0, length);
}
fStream.close();
ds.flush();
ds.close();

可以参考

①《在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传》 (http://bertlee.iteye.com/blog/1134576)。

②《关于android Http访问,上传,用了三个方法 》

2、使用Android HttpClient类上传参数。下面我在网上搜到得代码,忘记出处了

[java] view plaincopy
private static boolean sendPOSTRequestHttpClient(String path,
Map<String, String> params) throws Exception {
// 封装请求参数
List<NameValuePair> pair = new ArrayList<NameValuePair>();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
pair.add(new BasicNameValuePair(entry.getKey(), entry
.getValue()));
}
}
// 把请求参数变成请求体部分
UrlEncodedFormEntity uee = new UrlEncodedFormEntity(pair, "utf-8");
// 使用HttpPost对象设置发送的URL路径
HttpPost post = new HttpPost(path);
// 发送请求体
post.setEntity(uee);
// 创建一个浏览器对象,以把POST对象向服务器发送,并返回响应消息
DefaultHttpClient dhc = new DefaultHttpClient();
HttpResponse response = dhc.execute(post);
if (response.getStatusLine().getStatusCode() == 200) {
Log.i("http", "httpclient");
return true;
}
return false;
}

3、使用httpClient上传文字信息和文件信息。使用httpClient上传文件非常的方便。不过需要导入apache-mime4j-0.6.jar 和httpmime-4.0.jar两个.jar包。

[java] view plaincopy
// 封装请求参数
MultipartEntity mpEntity = new MultipartEntity();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {

StringBody par = new StringBody(entry.getValue());
mpEntity.addPart(entry.getKey(), par);
}
}
// 图片
if (!imagepath.equals("")) {
FileBody file = new FileBody(new File(imagepath));
mpEntity.addPart("photo", file);
}
// 使用HttpPost对象设置发送的URL路径
HttpPost post = new HttpPost(path);
// 发送请求体
post.setEntity(mpEntity);
// 创建一个浏览器对象,以把POST对象向服务器发送,并返回响应消息
DefaultHttpClient dhc = new DefaultHttpClient();
HttpResponse response = dhc.execute(post);

FileBody类可以把文件封装到表单中,实现附件的上传。

关于httpClient上传文件可以参考链接: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76721&page=1

需要用的的ja下载地址r:http://download.csdn.net/detail/china1988s/3791514

参考:

①《在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传》 (http://bertlee.iteye.com/blog/1134576)。

②《关于android Http访问,上传,用了三个方法 》
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 Android编程调用相机拍照问题。 我想把拍完的照片保存后,在同一个Activity中用ImageView显示出来 涤纶和毛制成的毛衣,哪个更好? Android/C++:实现电脑控制手机照相,并且把照片传给手机 做了一个Android的demo实现头像裁剪上传,但是拍照完成后出现如下图... 涤纶针织灯芯条面料 优缺点,洗涤方法 android相机拍照后上传到指定文件夹,opencv是通过调用文件夹里图片进行处理的吗?求大神指教 急急急,求涤纶针织面料水洗收缩率国家标准按那个标准来,合格范围又是多少 安卓手机app开发中的拍照上传问题 面料:针织 ,材质:涤纶与面料:织锦,材质:锦纶比哪种好? 针织雪纺和普通的涤纶面料有什么区别呢 针织涤纶面料做运动服面料好不好 成都社保卡改密码忘记了怎么办 成都社保卡 交易密码怎么修改 怎么区分针织、真丝、雪纺、涤纶等面料? 成都社保卡密码忘记了怎么办? 成都社保查询登陆密码忘记了怎么办 忘记成都社保交易密码怎么修改密码 炸一斤面的油条要放多少水? 成都社保忘记交易密码怎么修改 做一斤油条面,放多少水最合适? 为什么新建了一个ppt用wps打不开 WPS为什么打不开ppt?急用,在线等 安卓input file 支持拍照上传吗 股票上升趋势调整途中连收三根小阳线是什么意思 股票k线中的小阳线怎么看 股票涨停,k线为何是小阳线,这为什么 股票当中为什么有时成交量放的是巨量但是当天的K线却是小阴线或者小阳线?? 上影线下影线也不长?? 股票收吊顶小阳线预示着什么? 我是一名初中女生,爱穿凉鞋,可脚很臭 ,该怎么办呢? 女生放学回家脱了鞋,脚都会臭吗?我光脚穿鞋上学放学回家脱了鞋去闻也臭?我才上初二,而且我放学回家不 少女的鞋子什么味道啊? 我是一个女生15岁脚真的很臭一穿上鞋就很臭。洗了呢就不臭了,会出汗,不是烂脚丫。我每天都在洗脚, 女孩的鞋会发臭吗,好奇? 一般初中,女生,脚臭与,不臭的比例为多少 女生回答!女生穿什么鞋子,脚和袜子最臭? 女孩运动鞋什么味道 新能源汽车三元锂电池究竟安全与否 是否越来越多的国产新能源汽车采用三元锂电池 电动汽车都用什么电池 三元锂电池是主流 电动汽车的电池铁锂电池和三元锂电池哪个好