package org.nutz.http.sender;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Map.Entry;
import org.nutz.http.HttpException;
import org.nutz.http.Request;
import org.nutz.http.Response;
import org.nutz.lang.Files;
import org.nutz.lang.Streams;
public class FilePostSender extends PostSender {
public static final String SEPARATOR = "\r\n";
public FilePostSender(Request request) {
super(request);
}
@Override
public Response send() throws HttpException {
try {
String boundary = "---------------------------[Nutz]7d91571440efc";
openConnection();
setupRequestHeader();
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
setupDoInputOutputFlag();
Map<String, Object> params = request.getParams();
if (null != params && params.size() > 0) {
DataOutputStream outs = new DataOutputStream(conn.getOutputStream());
for (Entry<String,?> entry : params.entrySet()) {
outs.writeBytes("--" + boundary + SEPARATOR);
String key = entry.getKey();
File f = null;
if (entry.getValue() instanceof File)
f = (File)entry.getValue();
else if (entry.getValue() instanceof String)
f = Files.findFile(entry.getValue().toString());
if (f != null && f.exists()) {
outs.writeBytes("Content-Disposition: form-data; name=\""
+ key
+ "\"; filename=\""
+ entry.getValue()
+ "\"\r\n");
outs.writeBytes("Content-Type: application/octet-stream\r\n\r\n");
if(f.length() == 0)
continue;
InputStream is = Streams.fileIn(f);
byte[] buffer = new byte[8192];
while (true) {
int amountRead = is.read(buffer);
if (amountRead == -1) {
break;
}
outs.write(buffer, 0, amountRead);
}
outs.writeBytes("\r\n");
Streams.safeClose(is);
} else {
outs.writeBytes("Content-Disposition: form-data; name=\""
+ key
+ "\"\r\n\r\n");
outs.writeBytes(entry.getValue() + "\r\n");
}
}
outs.writeBytes("--" + boundary + "--" + SEPARATOR);
Streams.safeFlush(outs);
Streams.safeClose(outs);
}
return createResponse(getResponseHeader());
}
catch(IOException e) {
throw new HttpException(request.getUrl().toString(), e);
}
}
}