目录
回复讨论(解决方案)
首页 web前端 html教程 HTTPclient使用MultipartEntity怎么上传文件_html/css_WEB-ITnose

HTTPclient使用MultipartEntity怎么上传文件_html/css_WEB-ITnose

Jun 24, 2016 pm 12:01 PM
httpclient 上传 文件

jsp HTTPclient MultipartEntity multipart/form-data

jsp 页面上传文件代码:


  
  


httpclient 不知道怎么写,
网上查了一大堆都是你抄我我抄你的,
网上都是这么写的
jsp 代码是下面这样的
        enctype="multipart/form-data">
    
    
    
    


后天代码都是这样写的

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("\t[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("\t[参数] " + paramName + "=" + paramValue);
}

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

// // 请求body
// String requestBody = readFileByLines(request.getInputStream());
//
// System.out.println("\n[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  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("\t[response header] " + header.getName() + "=" + header.getValue());
}

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

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

你按他写的成功了吗?

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

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

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

微信文件过期怎么恢复 微信的过期文件能恢复吗 微信文件过期怎么恢复 微信的过期文件能恢复吗 Feb 22, 2024 pm 02:46 PM

打开微信,在我中选择设置,选择通用后选择存储空间,在存储空间选择管理,选择要恢复文件的对话选择感叹号图标。教程适用型号:iPhone13系统:iOS15.3版本:微信8.0.24解析1首先打开微信,在我的页面中点击设置选项。2接着在设置页面中找到并点击通用选项。3然后在通用页面中点击存储空间。4接下来在存储空间页面中点击管理。5最后选择要恢复文件的对话,点击右侧的感叹号图标。补充:微信文件一般几天过期1要是微信接收的文件并没有点开过的情况下,那在七十二钟头之后微信系统会清除掉,要是己经查看了微信

照片无法打开此文件,因为格式不受支持或文件已损坏 照片无法打开此文件,因为格式不受支持或文件已损坏 Feb 22, 2024 am 09:49 AM

在Windows系统中,照片应用是一个便捷的方式来查看和管理照片和视频。通过这个应用程序,用户可以轻松访问他们的多媒体文件,而无需安装额外的软件。然而,有时候用户可能会碰到一些问题,比如在使用照片应用时遇到“无法打开此文件,因为不支持该格式”的错误提示,或者在尝试打开照片或视频时出现文件损坏的问题。这种情况可能会让用户感到困惑和不便,需要进行一些调查和修复来解决这些问题。当用户尝试在Photos应用程序上打开照片或视频时,会看到以下错误。抱歉,照片无法打开此文件,因为当前不支持该格式,或者该文件

在Windows 11/10中,准备删除要花费很长时间 在Windows 11/10中,准备删除要花费很长时间 Feb 19, 2024 pm 07:42 PM

在本文中,我们将介绍如何解决在Windows系统中删除文件或文件夹时出现“准备删除”提示的问题。这个提示意味着系统正在进行一些后台操作,如检查文件权限、验证文件是否被其他程序占用、计算要删除项目的大小等。我们将为您提供一些解决方法,以确保您能够顺利删除文件,而无需等待太长时间。为什么Windows要花这么长时间才能删除文件?Windows准备删除文件所需的时间受多种因素影响,包括文件大小、存储设备速度和后台进程。长时间或被卡住的“正在准备删除”提示可能暗示系统资源不足、磁盘错误或文件系统问题。在

可以删除Tmp格式文件吗? 可以删除Tmp格式文件吗? Feb 24, 2024 pm 04:33 PM

Tmp格式文件是一种临时文件格式,通常由计算机系统或程序在执行过程中生成。这些文件的目的是存储临时数据,以帮助程序正常运行或提高性能。一旦程序执行完成或计算机重启,这些tmp文件往往就没有了存在的必要性。所以,对于Tmp格式文件来说,它们本质上是可以删除的。而且,删除这些tmp文件能够释放硬盘空间,确保计算机的正常运行。但是,在删除Tmp格式文件之前,我们需

出现0x80004005错误代码怎么办 小编教你0x80004005错误代码解决方法 出现0x80004005错误代码怎么办 小编教你0x80004005错误代码解决方法 Mar 21, 2024 pm 09:17 PM

在电脑中删除或解压缩文件夹,时有时候会弹出提示对话框“错误0x80004005:未指定错误”,如果遇到这中情况应该怎么解决呢?提示错误代码0x80004005的原因其实有很多,但大部分因为病毒导致,我们可以重新注册dll来解决问题,下面,小编给大伙讲解0x80004005错误代码处理经验。有用户在使用电脑时出现错误代码0X80004005的提示,0x80004005错误主要是由于计算机没有正确注册某些动态链接库文件,或者计算机与Internet之间存在不允许的HTTPS连接防火墙所引起。那么如何

夸克网盘的文件怎么转移到百度网盘? 夸克网盘的文件怎么转移到百度网盘? Mar 14, 2024 pm 02:07 PM

  夸克网盘和百度网盘都是现在最常用的储存文件的网盘软件,如果想要将夸克网盘内的文件保存到百度网盘,要怎么操作呢?本期小编整理了夸克网盘电脑端的文件转移到百度网盘的教程步骤,一起来看看是怎么操作吧。  夸克网盘的文件怎么保存到百度网盘?要将夸克网盘的文件转移到百度网盘,首先需在夸克网盘下载所需文件,然后在百度网盘客户端中选择目标文件夹并打开。接着,将夸克网盘中下载的文件拖放到百度网盘客户端打开的文件夹中,或者使用上传功能将文件添加至百度网盘。确保上传完成后在百度网盘中查看文件是否成功转移。这样就

如何安装GHO文件 如何安装GHO文件 Feb 19, 2024 pm 10:06 PM

gho文件是一种GhostImage影像文件,它通常用于将整个硬盘或分区的数据备份成一个文件。在一些特定的情况下,我们需要将这种gho文件重新安装回硬盘上,以还原硬盘或分区到先前的状态。下面将介绍gho文件的安装方法。首先,在安装之前,我们需要准备以下工具和材料:实体的gho文件:确保你拥有一份完整的gho文件,它通常以.gho为后缀名,并且包含有备份

hiberfil.sys是什么文件?hiberfil.sys可以删除吗? hiberfil.sys是什么文件?hiberfil.sys可以删除吗? Mar 15, 2024 am 09:49 AM

  最近有很多网友问小编,hiberfil.sys是什么文件?hiberfil.sys占用了大量的C盘空间可以删除吗?小编可以告诉大家hiberfil.sys文件是可以删除的。下面就来看看详细的内容。hiberfil.sys是Windows系统中的一个隐藏文件,也是系统休眠文件。通常存储在C盘根目录下,其大小与系统安装内存大小相当。这个文件在计算机休眠时被使用,其中包含了当前系统的内存数据,以便在恢复时快速恢复到之前的状态。由于其大小与内存容量相等,因此它可能会占用较大的硬盘空间。  hiber

See all articles