搜索
首页web前端html教程HTTPclient使用MultipartEntity怎么上传文件_html/css_WEB-ITnose

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
wpsystem是什么文件夹wpsystem是什么文件夹Sep 01, 2022 am 11:22 AM

wpsystem文件夹是windows应用文件夹;创建WpSystem文件夹是为了存储某些特定“Microsoft Store”应用程序的数据,因此建议不要删该文件夹,因为删除之后就无法使用指定的应用。

winreagent是什么文件夹winreagent是什么文件夹Aug 26, 2022 am 11:23 AM

winreagent是在系统更新或升级的过程中创建的文件夹;该文件夹中通常包含临时文件,当更新或升级失败时,系统将通过还原先前创建的临时文件来回滚到执行更新或升级过程之前的版本。

baidunetdiskdownload是什么文件夹baidunetdiskdownload是什么文件夹Aug 30, 2022 am 10:45 AM

baidunetdiskdownload是百度网盘默认下载文件的文件夹;百度网盘是百度推出的一项云存储服务,只要下载东西到百度网盘里,都会默认保存到这个文件夹中,并且可跨终端随时随地查看和分享。

usmt.ppkg是什么文件usmt.ppkg是什么文件Sep 09, 2022 pm 02:14 PM

“usmt.ppkg”是windows自带的系统还原功能的系统备份文件;Windows系统还原是在不需要重新安装操作系统,也不会破坏数据文件的前提下使系统回到原有的工作状态,PBR恢复功能的备份文件就是“usmt.ppkg”。

mobileemumaster是什么文件mobileemumaster是什么文件Oct 26, 2022 am 11:28 AM

mobileEmuMaster是手机模拟大师的安装文件夹。手机模拟大师是PC电脑模拟运行安卓系统的免费模拟器程序,一款可以让用户在电脑上运行手机应用的软件,支持安装安卓系统中常见的apk执行文件,支持QQ、微信等生活常用应用,达到全面兼容的效果。

config是什么文件夹可以删除吗config是什么文件夹可以删除吗Sep 13, 2022 pm 03:48 PM

config是软件或者系统中的配置文件,不可以删除;该文件是在用户开机时对计算机进行初始化设置,也就是用户对系统的设置都由它来对计算机进行恢复,因此不能删除软件或者系统中的config配置文件,以免造成错误。

备份文件的扩展名通常是什么备份文件的扩展名通常是什么Sep 01, 2022 pm 03:55 PM

备份文件的扩展名通常是“.bak”;bak文件是一个备份文件,这类文件一般在'.bak前面加上应该有原来的扩展名,有的则是由原文件的后缀名和bak混合而成,在生成了某种类型的文件后,就会自动生成它的备份文件。

kml是什么文件的格式kml是什么文件的格式Sep 14, 2022 am 10:39 AM

kml是谷歌公司创建的一种地标性文件格式;该文件用于记录某一地点或连续地点的时间、经度、纬度、海拔等地理信息数据,可以被“Google Earth”和“Google Maps”识别并显示。

See all articles

热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尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能