Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rudolfkr

Forçando o Download

Recommended Posts

Estou com um problema em minhas mãos que não estou conseguindo achar a solução!

 

é o seguinte, estou com um arquivo que se chama ex: arquivo.doc (poderá ser qualquer extensão)

 

O cliente deseja o seguinte.

 

Quando ele for inserir esse arquivo por formulário ele irá colocar o "cliente", o "fornecedor" e o "comprador" e selecionará o "arquivo.doc" e fará o upload, até ai tudo bem, o nome do arquivo é salvo no banco de dados, o do cliente, fornecedor e comprador também

 

Tudo funcionando perfeitamente, quando "forço" o download deste arquivo.doc ele baixa normal porém a questão é!

 

Esse arquivo deve ser renomeado conforme o "cliente", "fornecedor" ou "comprador" ué mas como assim?

 

Ex: Eu sou o Cliente X então quando eu quiser baixar esse "arquivo.doc" ele deverá vir para mim como "x.doc"

 

Se eu logar como fornecedor no sistema esse "arquivo.doc" deverá ser baixado como "y.doc" porém não quero "duplicar" o arquivo no servidor nem mudar o nome no banco de dados gostaria que ele baixa-se já com o nome certo...

 

Alguém tem alguma sugestão de como posso fazer isso? Sim eu acho que o pessoal poderia "redigitar" e pronto, o problema é, o nome ficará muito grande não terá acentos mas ficará grande, um exemplo? wmfcompForne1244863586258959364.xls esse é um nome do "fornecedor" o problema é que conforme a combinação de escolha do "cliente", "fornecedor" ou "comprador" esse nome pode ser ainda mais complicado, mas eu consigo fazer esse nome o problema é que quando ele vai baixar não consigo fazer baixar com esse nome o "arquivo.doc"

 

Será que conseguiram entender a minha dúvida?

 

por exemplo eu uso um código para forçar o download que é esse aqui.

 


public function download(arquivo, pasta)
    dim objStream
    set objStream = server.createObject("ADODB.Stream")
    with (response)
        .buffer = true  
        .addHeader "Content-Type","application/x-msdownload"
        .addHeader "Content-Disposition","attachment; filename="&arquivo  
        .flush  
    end with
    with (objStream)
        .open  
        .type = 1  
        .loadFromFile server.mapPath(pasta&"/"&arquivo)
    end with
    response.binaryWrite objStream.read
    set objStream = nothing
    response.flush
end function




<a href="<% call download("&arquivo&", "pasta") %>">baixe aqui</a>

Esse é um exemplo do código que estou utilizando... se puderem me ajudar nisso, se puderem me dar sugestões ou de como posso fazer...

 

 

 

 

Eu já tentei fazer o seguinte, pegar o "arquivo.doc" e quando ele faz isso, eu uso o "left(arquivo,4)" para pegar a extensão do arquivo, e dai apenas "somo" a variavel do nome monstro que gerou... mas como fazer ele baixar o arquivo tal apenas renomeando, essa foi uma das tentativas, se tiverem uma solução melhor estou todo "ouvido"

 

Thanks a lot!

 

 

Edit1: Ah não sou um user novo só pra constar, esse é um usuário antigo na verdade, pois perdi a senha do meu que era o "nemtconto" e não consigo recuperar então tenho que postar com esse "outro"

 

Edit2: Se for o caso acredito que não teria problema em "duplicar" o arquivo ou "triplicar" no caso... porém se tiver como não fazer isso será melhor, já que a hospedagem que o cliente possui existe um "limite" de espaço e tráfego ai já viu se passar né =) Ah e por sinal é bem podre e CARO ja tentei fazer ele mudar de idéia mas falou que o host é de um amigo e por isso ajuda ele e aquela história de sempre...

Compartilhar este post


Link para o post
Compartilhar em outros sites

li na corrida seu topico, pelo que entendi você tem um nome de arquivo no servidor mas no momento do download você precisa baixar outro nome. Se for isso basta mudar esta linha

 

de

.addHeader "Content-Disposition","attachment; filename="&arquivo

para

.addHeader "Content-Disposition","attachment; filename=nomequeeuquero" & mid(arquivo, instrrev(arquivo, ".")

Compartilhar este post


Link para o post
Compartilhar em outros sites

existe uma função no forum, que você pode renomear de acordo com seu critério ou gerar nomes, pode te ajudar

Compartilhar este post


Link para o post
Compartilhar em outros sites

existe uma função no forum, que você pode renomear de acordo com seu critério ou gerar nomes, pode te ajudar

 

 

Obrigado pessoal, vou fazer alguns testes com isso, vou procurar o que o xanburzum falou também, apesar de não ter encontrado antes vou tentar novamente.

 

Obrigado de novo..

 

PS: Xan se tiver como posta o link aqui para mim ou para alguma outra pessoal que chegue até esse tópico já tenha o link!

 

Gracias!

Compartilhar este post


Link para o post
Compartilhar em outros sites

prcure por gerar nomes ou renoear

Compartilhar este post


Link para o post
Compartilhar em outros sites

li na corrida seu topico, pelo que entendi você tem um nome de arquivo no servidor mas no momento do download você precisa baixar outro nome. Se for isso basta mudar esta linha

 

de

.addHeader "Content-Disposition","attachment; filename="&arquivo

para

.addHeader "Content-Disposition","attachment; filename=nomequeeuquero" & mid(arquivo, instrrev(arquivo, ".")

 

 

Obrigado pelo help, só faltou uma coisa no código

 

.addHeader "Content-Disposition","attachment; filename="&nomequeeuquero&"" & mid(arquivo, instrrev(arquivo, "."))

Porém funciona certinho, já resolvi utilizando essa linha e algumas outras coisas aqui porém rodou perfeito!

 

Segue o código abaixo!

 

PRIMEIRO SELECIONO O TIPO DE DOWNLOAD

<a class="LinkBranco" href="pagina.asp?tipo=wmf&id=<%=id%>">WMF</a> - <a class="LinkBranco" href="pagina.asp?tipo=campox&id=<%=id%>">FORNECEDOR</a> - <a class="LinkBranco" href="pagina.asp?tipo=campoy&id=<%=id%>">CLIENTE</a>

DEPOIS DISSO INDO PARA A PÁGINA.ASP RECUPERO AS VARIÁVEIS AONDE MUDA O NOME DO ARQUIVO DE ACORDO COM A NECESSIDADE

id = request("id")
tipo = request("tipo")

set recOF = server.CreateObject( "ADODB.recordset")
	SQL = "SELECT * FROM job WHERE id_job="&id
	recOF.open SQL, conbanco
	
        'RESGATA O ARQUIVO UPADO E GRAVADO O NOME DO BANCO EX: arquivo.pdf
	Arquivo = recOF("arquivo")
	
        'FUNÇÃO PARA RESGATAR(RENOMEAR) O NOME QUE DESEJO PARA ESSE arquivo.pdf
	if tipo = "wmf" then
        nomequeeuquero = recOF("wmf")
		else if tipo = "campox" then
		nomequeeuquero = recOF("campox")
			else if tipo = "campoy" then
			nomequeeuquero = recOF("campoy")
			end if
		end if
	end if

Response.Buffer = True
Response.AddHeader "Content-Type","application/x-msdownload"
Response.AddHeader "Content-Disposition","attachment; filename="&nomequeeuquero&"" & mid(Arquivo, instrrev(Arquivo, "."))
Response.Flush

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1
objStream.LoadFromFile Server.MapPath(Arquivo)
Response.BinaryWrite objStream.Read
objStream.Close
Set objStream = Nothing
Response.Flush

 

Rodou perfeito, se alguém tiver dúvida basta postar ai!

O código de download fiz algumas "mudanças" nele para rodar de acordo, não achei no forum então fica ai a dica também

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma coisa... o código funciona certinho

 

porém quando vou fazer isso com uma IMG, DOC ou XLS ele faz NORMAL porém quando ABRO o arquivo vem cheio daquelas letras "zuadas" além de que a IMG não mostra, PORÉM o PDF é o único que vem intacto... será que alguém saberia dizer qual o erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sempre utilizei esse abaixo e nunca me deu problema. testa aí e modifica para o que quer

 

abs

 

<%
	Function getFileName(ByVal fileName)
		dim fso, file
		
		set fso = server.createObject("Scripting.FileSystemObject")
		set file = fso.getFile(fileName)
		
		getFileName = file.name
		
		set file = nothing
		set fso = nothing
	End Function
	
	Function downloadFile(file)

		Server.ScriptTimeout = 30000
		
		Dim fileSize
		Dim chunk
		Dim i
		Dim objStream
		Dim ContentType
		Dim extensaoArquivo
		
		Const DIRETORIO_UPLOAD = "c:\inetpub\wwwroot\site\downloads"

		chunk = 2048
		
		If file <> "" Then
					
			Dim FileExt
			Const adTypeBinary = 1
			FileExt = Lcase(Trim(Mid("" & file, InStrRev("" & file, "."))))
			Select Case UCase(FileExt)
				Case "ASP", "ASA", "ASPX", "ASAX", "MDB"
					Response.Write "Não é possível acessar esse tipo de arquivo."
					Response.End
			end select
			Response.Clear
			Response.ContentType = "application/octet-stream"
			Response.Addheader "content-disposition", "attachment; filename=" & getFileName(DIRETORIO_UPLOAD & "\" & file)
			Set objStream = server.CreateObject("ADODB.Stream")
			objStream.type = adTypeBinary
			objStream.open
			objStream.LoadFromFile DIRETORIO_UPLOAD & "\" & file
			On Error Resume Next
			While not objStream.EOS
				Response.BinaryWrite objStream.Read(1024 * 64)
			Wend
			On Error GoTo 0
			objStream.Close
			Set objStream = Nothing
			Response.Flush
			Response.End

		end if
	End Function
	
	'uso
	
	downloadFile(request.QueryString("nomedoarquivodesejado"))
	
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Thanks again Jonathan... vou fazer uns testes aqui e volto com o resultado daqui a pouco!

 

Então o código funciona perfeitamente, mesmo modificando do jeito que preciso, porém ele da o mesmo erro que o que eu fiz para caso o nome seja renomeado, e se uso esse código seu quanto o meu para baixar o arquivo sem renomear funciona certinho... porém como disse se usar para "renomar" ele faz isso nos arquivos enfia uma monte de letra zuada, e no único que isso não acontece é no PDF

 

CODIGO FINAL, FUNCIONANDO 100% SEM ERROS

 

ABAIXO!

tipo = request("tipo")

	if tipo = "wmf" then
	nomequeeuquero = recOF("wmf")
		else if tipo = "campox" then
		nomequeeuquero = recOF("campox")
			else if tipo = "campoy" then
			nomequeeuquero = recOF("campoy")
			end if
		end if
	end if
	

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(Server.MapPath("NOMEDAPASTA"))
'Response.Write objFolder.Size & "em byte" 'Retorna o tamanho total da pasta, incluindo todos os seus arquivos.

Set fc = objFolder.Files
totalArq = fc.count
tamArq = Server.MapPath (".") & "\" & objFolder.Name 
Set arqObj = objFSO.GetFile(tamArq&"\"&recOF.fields("arquivo"))

if arqObj <> "" then	
'--------------------------------------------------------------------------
Response.Buffer = True
Dim strFilePath, strFileSize, strFileName

Const adTypeBinary = 2

strFilePath = "O CAMINHO DA IMG"
strFileName = arqObj.Name

Caminho = strFilePath + strFileName


Response.Clear


strFileType = lcase(Right(strFileName, 4))

Select Case strFileType

Case ".doc"
ContentType = "application/msword"

case ".ppt", ".pps",".pptm"
ContentType = "application/x-powerpoint"

Case ".txt" 
ContentType = "text/plain"

Case ".zip"
ContentType = "application/zip"

Case ".xls"
ContentType = "application/vnd.ms-excel"

Case ".gif"
ContentType = "image/gif"

Case ".jpg", "jpeg"
ContentType = "image/jpeg"

Case ".rtf"
ContentType = "application/rtf"

Case ".htm", "html"
ContentType = "text/html"

Case ".pdf"
ContentType = "application/pdf"

Case Else
ContentType = "application/octet-stream"

End Select

Response.Buffer = True
Response.ContentType = ContentType
Response.AddHeader "Content-Disposition","attachment; filename="&nomequeeuquero&"" & mid(strFileName, instrrev(strFileName, "."))
Response.Flush

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1
objStream.LoadFromFile Caminho
Response.BinaryWrite objStream.Read
objStream.Close
Set objStream = Nothing
Response.Flush

end if

Lembrando que trago o nome do arquivo por variável, então se você tem uma pequena noção de ASP já irá saber como utilizar o código acima! Mesmo assim, dúvidas basta perguntar que irei responder!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.