http上传 java_Java通过HTTP POST请求上传文件示例

概述:

http请求在所有的编程语言中几乎都是支持的,我们常用的两种为:GET,POST请求。一般情况下,发送一个GET请求都很简单,因为参数直接放在请求的URL上,所以,对于PHP这种语言,甚至只需要一行:file_get_content(url);就能完成数据的获取,但对于POST请求,由于其数据是在消息体中发送出去的,所以相对来说要麻烦一点,再涉及到需要发送文件等二进制的数据类型,就更需要更多的处理,下面我们用Java语言来实现POST请求发送数据,其他语言类似。

public classMainUI {private static final String REQUEST_PATH = "http://localhost/server_url.php";private static final String BOUNDARY = "20140501";/***@paramargs

*@throwsException*/

public static void main(String[] args) throwsException {//TODO Auto-generated method stub

URL url= newURL(REQUEST_PATH);

HttpURLConnection httpConn=(HttpURLConnection) url.openConnection();

httpConn.setConnectTimeout(3000); //设置发起连接的等待时间,3s

httpConn.setReadTimeout(30000); //设置数据读取超时的时间,30s

httpConn.setUseCaches(false); //设置不使用缓存

httpConn.setDoOutput(true);

httpConn.setRequestMethod("POST");

httpConn.setRequestProperty("Connection", "Keep-Alive");

httpConn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");

httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" +BOUNDARY);

OutputStream os=httpConn.getOutputStream();

BufferedOutputStream bos= newBufferedOutputStream(os);

String content= "--" + BOUNDARY + "\r\n";

content+= "Content-Disposition: form-data; name=\"title\"" + "\r\n\r\n";

content+= "我是post数据的值";

content+= "\r\n--" + BOUNDARY + "\r\n";

content+= "Content-Disposition: form-data; name=\"cover_img\"; filename=\"avatar.jpg\"\r\n";

content+= "Content-Type: image/jpeg\r\n\r\n";

bos.write(content.getBytes());//开始写出文件的二进制数据

FileInputStream fin = new FileInputStream(new File("avatar.jpg"));

BufferedInputStream bfi= newBufferedInputStream(fin);byte[] buffer = new byte[4096];int bytes = bfi.read(buffer, 0, buffer.length);while (bytes != -1) {

bos.write(buffer,0, bytes);

bytes= bfi.read(buffer, 0, buffer.length);

}

bfi.close();

fin.close();

bos.write(("\r\n--" +BOUNDARY).getBytes());

bos.flush();

bos.close();

os.close();//读取返回数据

StringBuffer strBuf = newStringBuffer();

BufferedReader reader= new BufferedReader(newInputStreamReader(

httpConn.getInputStream()));

String line= null;while ((line = reader.readLine()) != null) {

strBuf.append(line).append("\n");

}

String res=strBuf.toString();

System.out.println(res);

reader.close();

httpConn.disconnect();

}

}

下面,对上述的代码做一些必要的说明:

http发送的post数据是通过boundary和换行符来分割的,boundary是一个随机的字符串即可,但不要与你传递的参数名或参数值相同。

换行符要求也是比较严格的,数据的声明和数据的值之间需要两个换行符,两个数据之间要用boundary来划分。对于二进制的数据来说,只是参数的类型声明和普通的数据有点区别,比如上述的代码增加了filename和content-type,二进制的数据以字符流写出去就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值