`

http模拟文件上传

    博客分类:
  • j2ee
阅读更多
package snippet;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class HttpPostUtil {

private static String boundary = "--------httppost123";


    // 发送数据到服务器,返回一个字节包含服务器的返回结果的数组
public static byte[] send(String urlString,Map<String, File[]> fileparams,Map<String, String> textParams) throws Exception {
DataOutputStream ds;
URL url = new URL(urlString);
    HttpURLConnection conn;
   
    conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setConnectTimeout(10000); //连接超时为10秒
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + boundary);

try {
conn.connect();
} catch (SocketTimeoutException e) {
// something
throw new RuntimeException();
}

ds = new DataOutputStream(conn.getOutputStream());
Set<String> keySetFile = fileparams.keySet();
for (Iterator<String> it = keySetFile.iterator(); it.hasNext();) {
String name = it.next();
File[] values = fileparams.get(name);
if(values == null || values.length == 0){
continue;
}

for(File value :values){

ds.writeBytes("--" + boundary + "\r\n");
ds.writeBytes("Content-Disposition: form-data; name=\"" + name
+ "\"; filename=\"" + encode(value.getName()) + "\"\r\n");
ds.writeBytes("Content-Type: " + getContentType(value) + "\r\n");
ds.writeBytes("\r\n");
ds.write(getBytes(value));
ds.writeBytes("\r\n");
}
}

Set<String> keySetText = textParams.keySet();
for (Iterator<String> it = keySetText.iterator(); it.hasNext();) {
String name = it.next();
String value = textParams.get(name);
ds.writeBytes("--" + boundary + "\r\n");
ds.writeBytes("Content-Disposition: form-data; name=\"" + name
+ "\"\r\n");
ds.writeBytes("\r\n");
ds.writeBytes(encode(value) + "\r\n");
}

ds.writeBytes("--" + boundary + "--" + "\r\n");
ds.writeBytes("\r\n");
InputStream in = conn.getInputStream();

int code = conn.getResponseCode();
if (code != 200) {
throw new Exception("请求" + urlString + "服务异常");
}

ByteArrayOutputStream out = new ByteArrayOutputStream();
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
conn.disconnect();
return out.toByteArray();
}

    //获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream
private  static String  getContentType(File f) throws Exception {

// return "application/octet-stream";  // 此行不再细分是否为图片,全部作为application/octet-stream 类型
ImageInputStream imagein = ImageIO.createImageInputStream(f);
if (imagein == null) {
return "application/octet-stream";
}
Iterator<ImageReader> it = ImageIO.getImageReaders(imagein);
if (!it.hasNext()) {
imagein.close();
return "application/octet-stream";
}
imagein.close();
return "image/" + it.next().getFormatName().toLowerCase();//将FormatName返回的值转换成小写,默认为大写

}
    //把文件转换成字节数组
private static byte[] getBytes(File f) throws Exception {
FileInputStream in = new FileInputStream(f);
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int n;
while ((n = in.read(b)) != -1) {
out.write(b, 0, n);
}
in.close();
return out.toByteArray();
}


// 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码
    private static String encode(String value) throws Exception{
    return URLEncoder.encode(value, "UTF-8");
    }

    public static void main(String[] args) throws Exception {
   
String urlString = "http://192.168.2.187/upload.shtml";

File [] files = new File[2];
files[0] = new File(
"C:/Users/Administrator/Desktop/2.png");
files[1] = new File(
"C:/Users/Administrator/Desktop/3.png");

Map<String, String> textParams = new HashMap<String, String>();
Map<String, File[]> fileparams = new HashMap<String, File[]>();

fileparams.put("files", files);

textParams.put("childDir", "shop");

byte[] b = HttpPostUtil.send(urlString,fileparams,textParams);
String result = new String(b);
System.out.println(result);

}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics