用HttpURLConnection提交文件

Posted lljliulljn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用HttpURLConnection提交文件相关的知识,希望对你有一定的参考价值。

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class HttpMultipart

public static void main(String[] args) throws Exception

String link = “http://www.xxx.com/upload“;
HttpMultipart hm = new HttpMultipart(link).addParameter(“file”, new File(“d:\\xxx.doc”)).addParameter(“other”,”somevalue”);
String result = new String(hm.send());
hm.clearParameter();
System.out.println(result);



private URL url;// 链接URL

private String boundary = "--------" + UUID.randomUUID().toString().replace("-", "");// HTTP报文分隔符

private Map<String, List<String>> textParams = new HashMap<String, List<String>>();// 字符串表单存储结构

private Map<String, List<File>> fileParams = new HashMap<String, List<File>>();// 文件表单存储结构

public HttpMultipart(String url) throws Exception

    this.url = new URL(url);


protected Map<String, List<File>> getFileParams()

    return fileParams;


protected Map<String, List<String>> getTextParams()

    return textParams;


// 增加一个普通字符串数据到form表单数据中
public HttpMultipart addParameter(String name, String value)

    List<String> list = textParams.get(name);
    if (list == null)
    
        list = new LinkedList<String>();
        list.add(value);
        textParams.put(name, list);
    
    else
    
        list.add(value);
    
    return this;


// 增加一个文件到form表单数据中
public HttpMultipart addParameter(String name, File value)

    List<File> list = fileParams.get(name);
    if (list == null)
    
        list = new LinkedList<File>();
        list.add(value);
        fileParams.put(name, list);
    
    else
    
        list.add(value);
    
    return this;


// 删除指定的字符串参数
public HttpMultipart removeTextParameter(String name)

    textParams.remove(name);
    return this;


// 删除指定的字符串参数(如果是数组,指定数组下标)
public HttpMultipart removeTextParameter(String name, int index)

    List<String> list = textParams.get(name);
    if (list != null)
    
        if (list.size() > index)
        
            list.remove(index);
        
        if (list.size() == 0)
        
            textParams.remove(name);
        
    
    return this;


// 删除指定的文件参数
public HttpMultipart removeFileParameter(String name)

    fileParams.remove(name);
    return this;


// 删除指定的文件参数(如果是数组,指定数组下标)
public HttpMultipart removeFileParameter(String name, int index)

    List<File> list = fileParams.get(name);
    if (list != null)
    
        if (list.size() > index)
        
            list.remove(index);
        
        if (list.size() == 0)
        
            fileParams.remove(name);
        
    
    return this;


// 清除字符串参数
public HttpMultipart clearTextParameter()

    textParams.clear();
    return this;


// 清除文件参数
public HttpMultipart clearFileParameter()

    fileParams.clear();
    return this;


// 清除所有参数
public HttpMultipart clearParameter()

    textParams.clear();
    fileParams.clear();
    return this;


// 发送数据到服务器,返回一个字节包含服务器的返回结果的数组
public byte[] send() throws Exception

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

    long length = getLength();
    connection.setDoOutput(true);
    connection.setUseCaches(false);
    connection.setConnectTimeout(10000); // 连接超时为10秒
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
    connection.setRequestProperty("Content-Length", length + "");
    // connection.setFixedLengthStreamingMode((int) length);//设置上传流大小,防止OutOfMemoryError;但是Int的最大值只支持2G,所以暂时不用;
    connection.setChunkedStreamingMode(65536);// 设置上传流区块大小,防止OutOfMemoryError

    connection.connect();
    OutputStream o = connection.getOutputStream();
    writeFileParams(o);
    writeTextParams(o);
    paramsEnd(o);
    InputStream in = connection.getInputStream();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    transfer(in, out, 1024);
    out.close();
    in.close();
    connection.disconnect();
    return out.toByteArray();


// 获取一个字符串表单的长度
private long getParamLength(String name, String value) throws Exception

    return 49 + boundary.length() + name.length() + value.getBytes().length;


// 获取一个文件表单的长度
private long getParamLength(String name, File value) throws Exception

    return 102 + boundary.length() + name.length() + value.getName().getBytes().length + value.length();


// 获取报文的长度
private long getLength() throws Exception

    long length = 0;
    for (String name : textParams.keySet())
    
        List<String> list = textParams.get(name);
        for (String value : list)
        
            length = length + getParamLength(name, value);
        
    
    for (String name : fileParams.keySet())

以上是关于用HttpURLConnection提交文件的主要内容,如果未能解决你的问题,请参考以下文章

HttpURLConnection 提交表单,没响应

Android端通过HttpURLConnection上传文件到server

Android端通过HttpURLConnection上传文件到服务器

通过HttpURLConnection模拟post表单提交

android HttpURLConnection 中post 上传表单,在数据库中最后一个字段出现乱码

HttpURLConnection如何传递参数?