File Upload como o curl

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 ? :slight_smile:

Eu tive um problema parecido com o seu. Porem, eu estou enviando um post multipart para o meu servidor tomcat e não consigo recuperar os dados enviados. Nem mesmo os parâmetros string estou conseguindo. Não vem valor nenhum quando utilizado o getParameter do request.

Se faço um post sem ser multipart, funciona. Não sei o que posso fazer para recuperar os parâmetros. Alguma dica?