Bom, eu estou fazendo um programa que faz upload de arquivos a um server, já consegui fazer o programa enviar os arquivos ao server usando HttpURLConnection mas o problema é que enquanto o upload acontece não há qualquer tipo de “feedback”, digo, preciso que o meu programa monitore o upload, pelo menos, que ele seja capaz de saber quantos bytes ja foram enviados.
Este é o meu codigo até agora:
public void post(UploadToken ut)
{
HttpURLConnection conn = null;
String data = encodeData(ut);
try{
byte[] bytedata = data.getBytes("ISO-8859-1");
URL url = new URL(ut.getURL());
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty( "User-Agent", agent );
conn.setRequestProperty( "Content-Type", type );
conn.setRequestProperty( "Content-Length",Integer.toString(bytedata.length,10));
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
for(int i=0;i<bytedata.length;i++)
{
os.write(bytedata[i]);
os.flush(); // não adianta usar flush, nada acontece
}
System.out.println("è aqui que os bytes começam a ser enviados de fato");
InputStream in = conn.getInputStream();
System.out.println("esta linha não é executada até que todos os bytes sejam enviados");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = br.readLine()) != null)
{
parent.response(line);
}
os.close();
br.close();
}catch(IOException ioe)
{
int code = -1;
try{code = conn.getResponseCode();}catch(Exception e){System.out.println(e);}
System.out.println(ioe+ " httpconnection:"+code);
parent.getInfo().setStatus(UploadInfo.ERROR);
}
}
Eu sei que parece estranho mas acontece exatamente como esta escrito no codigo, apenas quando conn.getInputStream() é executado é que os bytes são enviados.
naum entedi muito bem sua app dei um alhada muito rápida mas se eu nuam me engano se vc fizer isso com socket vc vai enviando os bytes e vc tem o tamanho total então vc consegue saber a porcentagem enviada!
consegui fazer o upload por socket, o unico problema foi ter que montar os header do post na mão…
Mas, apesar do upload ser concluido com verificação de md5 e tudo, o server parece reclama ainda porque dentre as valores que ele me retorna parece um “null” :shock: e isso não acontece quando eu uso o otro metodo…eu devo ter feito alguma besteira por ai…
Segue o novo codigo:
public void postSocket(UploadToken ut)
{
String CRLF = "\r\n";
String data = encodeData(ut);
try
{
byte[] bytedata = data.getBytes("ISO-8859-1");
String header = "";
header += "POST "+ut.getPath()+" HTTP/1.0"+CRLF;
header += "User-Agent: "+agent+CRLF;
header += "Content-Length: "+Integer.toString(bytedata.length,10)+CRLF;
header += "Content-Type: "+type+CRLF;
header += CRLF;
String total = header + data;
byte[] totalbytes = total.getBytes("ISO-8859-1");
Socket socket = new Socket(ut.getServer(), ut.getPort());
OutputStream out = socket.getOutputStream();
for(int i=0;i<totalbytes.length;i++)
{
out.write(totalbytes[i]);
parent.getInfo().addProgress(1);
}
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = br.readLine()) != null)
{
System.out.println(line);
String r = line.trim();
if(r.length()>0 && r.charAt(0)=='{')parent.response(r); // o que realmente importa esta entre chaves { }
}
out.close();
br.close();
}catch(Exception ex)
{
System.out.println(ex+" exception");
}
}