Tenho um cliente que já tem uma solução em CGI para subir (UPLOAD) arquivos no servidor. É um script em perl, que sobe arquivos enviados via ‘curl’.
Tentei implementar um client desse CGI, sem sucesso.
No manual do Curl (http://www.hmug.org/man/1/curl.php), diz utilizar a RFC1867 para enviar dados (Multipart Form), porém não funciona.
Como usava RFC1867, implementei um client com o HttpClient do Jakarta Commons. Mas tenho um dos dois problemas abaixo:
-> Em alguns casos, o CGI não consegue ler os parâmetros
-> Se consegue ler os parâmetros, não consegue encontrar o conteúdo do arquivo !
Uma tentativa foi:
public boolean send(String dirDestino, String fileName, String hash)
{
boolean status = false;
int executeMethod;
String fileResp = null;
try {
File fl = new File(fileName);
if(fl.canRead() && fl.isFile()){
PostMethod filePost = new PostMethod(URL_SERVER+URL_TRANSFER);
FilePart fp = new FilePart("file", new File(fileName));
Part[] parts = { new StringPart("action", "snd"),
new StringPart("dirname", dirDestino),
new StringPart("filename", new File(fileName).getName()),
new StringPart("md5sum", hash),
fp};
filePost.setRequestEntity( new MultipartRequestEntity(parts, filePost.getParams()) );
HttpClient client = new HttpClient();
executeMethod = client.executeMethod(filePost);
InputStream in = filePost.getResponseBodyAsStream();
if(in != null){
fileResp = this.writeTempFile(in, "response", new File(TEMP_DIR).getAbsolutePath());
}
}
} catch (Exception e) {
System.out.println("HttpTransfer::send:exception "+e.toString());
}
return(false);
}
E depois tentei com outputstream (numa tentativa de estupro via socket):
public boolean sendOutStream(String dirDestino, String fileName, String hash)
{
String fileResp = null;
boolean ret=false;
try {
URL url = new URL(URL_SERVER+URL_TRANSFER);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
OutputStream os = connection.getOutputStream();
FilePart fp = new FilePart("text", new File(fileName));
StringPart sAction = new StringPart("action", "snd");
StringPart sDir = new StringPart("dirname", dirDestino);
StringPart sFile = new StringPart("filename", new File(fileName).getName());
StringPart sMD5 = new StringPart("md5sum", hash);
if(os != null){
sAction.send(os);
sDir.send(os);
sFile.send(os);
sMD5.send(os);
fp.send(os);
os.close();
connection.connect();
}
InputStream in = connection.getInputStream();
if(in != null){
fileResp = this.writeTempFile(in, "response", new File(TEMP_DIR).getAbsolutePath());
}
} catch (Exception e) {
System.out.println("HttpTransfer::sendOutStream:exception "+e.toString());
}
return(ret);
}
Nestes dois exemplos, lê os parâmtros mas não o arquivo. O CGI lê a stdin ("$_") então não sei como posso mandar o conteúdo do arquivo senão como multipart !
Alguém teve que implementar alguma estupidez similar ?