httpclient上传带附件的参数

本文介绍了一个Java程序示例,展示了如何获取文件的MIME类型以及如何使用HttpClient库上传文件到指定URL。该过程包括设置HTTP请求头、处理文件路径、构造上传请求实体等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

public static String getMimeType(String fileUrl) throws java.io.IOException {

FileNameMap fileNameMap = URLConnection.getFileNameMap();

String type = fileNameMap.getContentTypeFor(fileUrl);

 

return type;

}

 

// 上传带附件的参数:

public static String uploadFile(String filePath, String id, int bid) {

File file = new File(

"D:\\workspace\\NewsRobot\\download\\laddyphoto\\37294_236809_702347.jpg");

if (!file.exists()) {

return "文件不存在!";

}

String url = "http://www.chahushequ.com/post.bbscs";

PostMethod filePost = new PostMethod(url);

 

//仅设置User-Agent就行,不用设置Content-Type,设置了Content-Type有可能导致上传不成功

filePost .setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0");

 

// set cookie

if (_cookies != null) {

filePost.setRequestHeader("Cookie", _cookies);

}

 

try {

// FilePart:用来上传文件的类

FilePart fp = new FilePart("headImageFile", file); // Part:类专门用来上传文件,其子类

// ,FilePart:用来上传文件的类

// StringPart:普通的文本参数

System.out.println("---" + fp);

 

fp.setContentType(getMimeType(filePath));

 

// StringPart:普通的文本参数

StringPart idPart = new StringPart("id", "");

StringPart bidPart = new StringPart("bid", String.valueOf(bid));

StringPart action = new StringPart("action", "upfiledo");

 

Part[] parts = { idPart, bidPart, action, fp };

 

// 对于MIME类型的请求,httpclient建议全用MulitPartRequestEntity进行包装

MultipartRequestEntity mre = new MultipartRequestEntity(parts,

filePost.getParams());

 

filePost.setRequestEntity(mre);

 

HttpClient client = new HttpClient();

client.getHttpConnectionManager().getParams().setConnectionTimeout(

50000);// 设置连接时间

int status = client.executeMethod(filePost);

System.out.println(status + "--------------");

if (status != HttpStatus.SC_OK) {

System.out.println(status + "--------------fail----");

} else if (status == HttpStatus.SC_OK) {

String str = "";

str = filePost.getResponseBodyAsString();

System.out.println(filePost.getResponseBodyAsString()

+ "---------服务器返回值---------");

}

 

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

<think>好的,用户想知道如何在PowerBuilder中实现上传附件的功能,并且需要示例代码。首先,我需要回忆一下PowerBuilder的相关知识,尤其是文件上传的部分。根据用户提供的引用内容,引用[1]提到了PB FTP源码实例,引用[2]则介绍了通过Http协议上传和下载文件的方法。这说明在PowerBuilder中,文件上传可以通过FTP或HTTP两种方式实现。 用户的需求是实现上传附件,通常在企业应用中,可能更倾向于使用HTTP协议,尤其是与Web服务交互的情况。所以可能需要考虑使用HttpClient组件,如引用[2]所提到的。但用户可能需要具体的示例代码,因此需要结合这两种方法给出不同的实现方案。 首先,针对FTP方式,引用[1]中的示例可能涉及FTP连接、命令执行等步骤。我需要整理出FTP上传的基本流程,包括创建FTP会话、连接服务器、登录、设置传输模式、上传文件以及错误处理。同时,用户可能对代码结构不太熟悉,所以需要分步骤说明,并确保代码语法正确。 其次,HTTP方式的话,引用[2]提到可以使用HttpClient组件进行Post请求上传文件。这里可能需要用到multipart/form-data格式,这在PB中如何实现呢?可能需要调用相关的函数或使用OLE对象,比如WinHttp.WinHttpRequest.5.1。这部分需要编写示例代码,并解释关键步骤,比如打开文件、设置请求头、发送数据等。 另外,用户对象(如引用[3])可以用来封装上传功能,提高代码复用性。因此,在示例中可以建议创建自定义用户对象,处理上传逻辑,这样在主窗口中只需调用该对象的方法即可。这有助于模块化设计,符合最佳实践。 还需要考虑错误处理和异步操作,尤其是大文件上传时,异步处理可以避免界面冻结。引用[2]提到支持异步上传,所以可能需要展示如何异步调用上传方法,或者使用多线程处理。 在整理示例代码时,需要注意PowerBuilder的语法,比如使用OLEObject时的方法调用,以及事件处理的写法。同时,要确保代码中的关键步骤有注释,方便用户理解。 最后,要生成相关问题,帮助用户深入理解。比如比较FTP和HTTP上传的优缺点,如何处理大文件,或者如何集成到数据库应用中。这些问题可以引导用户进一步探索。</think>在PowerBuilder中实现文件上传功能可通过FTP或HTTP两种主流方式实现,以下是两种方法的实现示例及技术要点: ### 一、基于FTP协议的文件上传 ```powerbuilder // 创建FTP会话 oleobject lole_ftp lole_ftp = CREATE oleobject IF lole_ftp.ConnectToNewObject("MSFTPS.Ftp") = 0 THEN // 设置服务器参数 lole_ftp.URL = "ftp://your.ftp.server.com" lole_ftp.UserName = "username" lole_ftp.Password = "password" // 建立连接并上传 IF lole_ftp.Connect() THEN lole_ftp.SetCurrentDirectory("/upload") // 设置目标目录 lole_ftp.PutFile("C:\local\file.txt", "remote_file.txt") MessageBox("提示", "上传成功") ELSE MessageBox("错误", "连接失败:" + lole_ftp.LastErrorText) END IF lole_ftp.Disconnect() END IF DESTROY lole_ftp ``` *关键点:* 1. 需注册`MSFTPS.Ftp`组件 2. 支持二进制/ASCII传输模式切换 3. 建议封装为自定义用户对象实现复用[^3] ### 二、基于HTTP协议的文件上传 ```powerbuilder // 使用WinHttpRequest对象 OLEObject lo_http lo_http = CREATE OLEObject IF lo_http.ConnectToNewObject("WinHttp.WinHttpRequest.5.1") = 0 THEN // 读取本地文件 Blob lb_data FileOpen("C:\local\file.txt", StreamMode!) FileRead(lb_data, FileLength("C:\local\file.txt")) FileClose() // 构造请求 string ls_boundary = "--BOUNDARY--" string ls_body = ls_boundary + "~r~n" ls_body += 'Content-Disposition: form-data; name="file"; filename="file.txt"~r~n' ls_body += "Content-Type: application/octet-stream~r~n~r~n" ls_body += String(lb_data, EncodingUTF8!) + "~r~n" + ls_boundary + "--" // 发送请求 lo_http.Open("POST", "http://your.api/upload") lo_http.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + ls_boundary) lo_http.Send(ls_body) IF lo_http.Status = 200 THEN MessageBox("状态", "上传成功:" + lo_http.ResponseText) ELSE MessageBox("错误", "上传失败:" + String(lo_http.Status)) END IF END IF DESTROY lo_http ``` *扩展功能建议:* 1. 进度显示:在`Progress`事件中更新进度条 2. 异步处理:使用`PostAsynchronously`属性[^2] 3. 安全传输:配置SSL证书进行HTTPS加密传输 ### 三、用户界面集成方案 1. 创建`uo_file_uploader`自定义用户对象[^3] 2. 添加`uf_upload(string as_filepath)`方法 3. 实现拖放文件检测功能: ```powerbuilder // 在窗口的DragDrop事件中 IF GetFileType( draggedobject() ) = FileTypeDrop! THEN this.uf_upload( draggedobject().FileName ) END IF ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值