Interromper Download

6 respostas
L

Bom, acho que estou postando no lugar certo...

O seguinte, fiz um script de download de arquivo, mas claro, isso é básico, o que estou com problemas é, caso a pessoa interrompa o download, quero saber se tem como ele continuar tal download mais tarde
O link de download pega ID do arquivo encriptado, por exemplo, http://XXXXX/d/ID_DO_ARQUIVO

A função de download seria essa

private void doDownload(File fileDown, FileInstance fileInst, AccountInstance user, HttpServletResponse response, String clientIp)
	{
		DownloadLog downLog = DownloadLog.getInstance();
		response.setContentType(fileInst.getMime());
		response.setHeader("Content-Disposition", "attachment; filename=\"" + fileInst.getName() + "\"");
		response.setContentLength((int) fileDown.length());
		InputStream inFile = null;
		OutputStream outFile = null;

		long startTime = System.currentTimeMillis();
		long endTime;
		int downSpeed = Config.MAX_CLIENT_DSPEED;
		int fileId = fileInst.getObjectId();
		long fileSize = fileInst.getSize();
		long readSize = 0;

		int userId = (user != null) ? user.getObjectId() : 0;
		if (user != null && user.getPremiumTime() > startTime)
			downSpeed = (int) fileDown.length();

		int cLogId = downLog.newCDLog(fileId, startTime, 0, userId, clientIp);
		
		try
		{
			outFile = response.getOutputStream();
			inFile = new FileInputStream(fileDown);
			//System.out.println(inFile);
			int i = 0;
			byte buffer[] = new byte[downSpeed * 1024];
			while ((i = inFile.read(buffer)) != -1)
			{
				outFile.write(buffer, 0, i);
				outFile.flush();
				readSize += i;
				downLog.updCDLog(1, cLogId);
				Thread.sleep(1000);
			}
		}
		catch (IOException ex) { }
		catch (Exception ex) { }
		finally
		{
			endTime = System.currentTimeMillis();
			downLog.updCDLog(2, cLogId);
			if (readSize >= fileSize)
				downLog.newDLog(fileId, startTime, endTime, userId, clientIp);
			
			if (outFile != null)
			{
				try
				{
					outFile.flush();
					outFile.close();
				}
				catch (IOException ex) {}
			}
			if (inFile != null)
			{
				try
				{
					inFile.close();
				}
				catch (IOException ex) {}
			}
		}
	}

6 Respostas

G

Isso é simples. Quando o browser vai fazer resume de um arquivo ele te envia um header (que não lembro qual) dizendo qual o ponto de inicio. De posse desse numero (em bytes) você consegue saber de onde seguir.

L

hmmm, se alguem souber quais são esses headers, responda por favor

G

Estive analisando a documentação das headers e response codes do protocolo http e fazendo um debug em meu wget, e acho que isso pode te interessar. Fiz um teste usando um RPM para o Fedora12.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.27
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

---request begin---
GET /linux/updates/12/i386/AcetoneISO2-2.2.1-1.fc12.i686.rpm HTTP/1.0
Range: bytes=113765-
User-Agent: Wget/1.11.4 (Red Hat modified)
Accept: */*
Host: fedora.zero42.at
Connection: Keep-Alive

Note o que coloquei em negrito. Pela documentação é essa a header enviada. Uma coisa que tu pode fazer é criar um servlet para download que imprime todas as headers enviadas. Você pode usar para isso o wget com o parametro -c de continue.

Para imprimir todas as headers enviadas pelo navegador ou download manager use:

final Enumeration<String> headers = request.getHeaderNames();
    while(headers.hasMoreElements()) {
        String name = headers.nextElement();
        Object value = request.getHeader(name);

        System.out.println(name + " >> " + value);
}
L

Valeu pela ajuda, até ai eu consegui faze, mas tem outro problema, o gerenciador de arquivo não recomeça o download, eu preciso defini algum header pra ele aceita o recomeço de download?

EDIT: CONSEGUI

Mas outro problema surgiu, eu tinha feito pra pega o bytes e assim converte ele pra int mas o gerenciador ta enviando outro tipo de header bytes

Firefox Envia:
bytes=162542-
Gerenciador Bitcomet Envia:
bytes=1210043-1600886

O que seria -?

Fiz um log

Bitcoment recomeçar:
host >> localhost
connection >> close
accept >> */*
range >> bytes=1926843-2215286
user-agent >> Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
pragma >> no-cache
cache-control >> no-cache

FileDown Exception Error: ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
FileDown Exception Error: ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
FileDown Exception Error: ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
FileDown Exception Error: ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
Firefox recomeçar:
host >> localhost:8081
user-agent >> Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
accept >> text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language >> pt-br,en-us;q=0.8,pt;q=0.5,en;q=0.3
accept-encoding >> gzip,deflate
accept-charset >> ISO-8859-1,utf-8;q=0.7,*;q=0.7
keep-alive >> 300
connection >> keep-alive
cookie >> JSESSIONID=EBEECAB9D413D76D798A68A41BDC5A21
range >> bytes=614400-

FileDown Exception Error: ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
G

LeafaR19, no caso do firefox ele indica de X até o final, já o Bitcoment vai de X até Y. Um exemplo, se você tem um arquivo de 1024 bytes e parou no byte 99, você terá:

Firefox (indica o ponto de inicio apenas)

bytes=100-

Bitcoment (indica inicio e fim)

bytes=100-1024

Se você olhar aqui no link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16, tem exemplos que mostram que se você tiver 0-499 indica de zero até 499 bytes, e 500-999 indica do 500 até 999.

L

Valeu pelas ajudas, mas surgiu mais uma.

Eu procurei até, normal eu consigo, mas pelo servlet não.

Como eu uso o pointer no servlet, pra assim indica o lugar pra continua o download, alguém poderia me ajudar?

Criado 21 de novembro de 2009
Ultima resposta 21 de fev. de 2010
Respostas 6
Participantes 2