webForumDet fria alternativet

Välja var skapad fil skall sparas.

ASP

16 svar · 432 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Hej!

Jag sitter och håller på med ett script som skall generera en textfil och sprar den på hårddisken.

Hur gör man smidigast för att välja var den skall sparas och vad den skall heta?

Jag tänkte mig som när man tex väljer en fil för uppladdning med:

<form id="form1" name="form1" enctype="multipart/form-data" method="post" action="">
  <label>test
  <input type="file" name="file" />
  </label>
</form>

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#2

hmmm..

Ingen... ? :)

Mvh
Henrik

Medlem sedan juni 20006 022 inlägg
#3

Vad har du för komponent som ska sköta uppladdningen?

Medlem sedan jan. 20013 582 inlägg
#4

Njaaaa... Jag har ingen komponent. Utan bara ett script som genererar en textfil mha data från en databas.

Jag kanske är ute och cyklar...

I nuläget så sätter jag ju en sökväg till en mapp på servern där jag vill att filen ska hamna, och det gör den...

Hmmm.. det kanse behövs en kompont att skicka filen från servern...??

Mvh
Henrik

Medlem sedan juni 20006 022 inlägg
#5

Vad händer när du trycker på submitknappen? Hur ser den koden ut?

Medlem sedan jan. 20013 582 inlägg
#6

Hej! :)

Den kodsnutten ovan var bara ett exempel på filuppladdningsfältet... Bara för att visualisera hur jag ville göra... Det kanske förvirrade det hela??

Så här ser koden ut i alla fall:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<%
dim objConn, objRS, sSQL, fsObj,tfile, iSupplierId, sUnit, sEndChar, sPath, sFileName

'Sätta leverantörs ID
iSupplierId = 5

sEndChar = "X"
sPath = "/prisfiler/"
sFileName = "Selga - El.txt"

function GetFixedWidthString(stringVal,length)
   GetFixedWidthString=left(stringVal & string(length," "),length)
end function

' Öppna databasen
' ***************
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = Application("sConn")
objConn.Open

set fsObj=Server.CreateObject("Scripting.FileSystemObject")
set tfile=fsObj.CreateTextFile(server.MapPath(sPath & sFileName))

'Skapa huvudet i textfilen
tfile.WriteLine("[HEADER]")
tfile.WriteLine("<Article.Nr>,8")
tfile.WriteLine("<Article.Price>,8")
tfile.WriteLine("<Article.Unit>,5")
tfile.WriteLine("<Article.Name>,50")
tfile.WriteLine("End,1")
tfile.WriteLine("[DATA]")

sSQL = 	"SELECT tblArticle.articlenumber, tblArticle.articleName, tblPrice.articlePrice, tblPrice.articleCategoryNumber, tblArticle.articleUnit, " &_
		"tblCategory.CategoryName, tblCategory.categoryNumber, tblDiscount.articleDiscount, tblSupplier.SupplierName, tblSupplier.SupplierId, " &_
		"CASE WHEN articleDiscount is null THEN articlePrice ELSE articlePrice*(1-([articleDiscount]*0.01)) END AS articlePriceWithDiscount " &_
		"FROM tblArticle " &_
		"INNER JOIN tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber " &_
		"INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId " &_
		"LEFT OUTER JOIN tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND tblPrice.articleSupplierId = tblDiscount.supplierId " &_
		"LEFT OUTER JOIN tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND tblPrice.articleCategoryNumber = tblCategory.categoryNumber " &_
		"WHERE tblSupplier.supplierId = " & iSupplierId & " " &_
		"ORDER BY tblArticle.articlenumber"
		
Set objRS = Server.Createobject("ADODB.Recordset")
objRS.Open sSQL, objConn, 1, 2

'Loopa ut datat från databasen och skriva till textfilen
Do while not objRS.EOF
	
	sArticleNumber = GetFixedWidthString(objRS("articleNumber"), 8)
	dArticlePrice = GetFixedWidthString(cdbl(objRS("articlePrice")), 8)
	sUnit = GetFixedWidthString(objRS("articleUnit"), 5)
	sArticleName = GetFixedWidthString(objRS("articleName"), 50)
	
	sLine = sArticleNumber & dArticlePrice & sUnit & sArticleName & sEndChar
	
	tfile.WriteLine(sLine)
	
	objRS.Movenext 
Loop 

objRS.Close
Set objRS = Nothing

tfile.close
set tfile=nothing
set fsObj=nothing

[b]'Kod för att skicka vidare till den skapade filen[/b]
[b]Response.redirect sPath & sFileName[/b]
%>
<body>
</body>
</html>

Tanken är att:
1. Skapa filen
2. Skicka besökaren till den skapde filen så den kan hämtas

Det fungerar ju nästan... ;)

Eftersom det är en textfil så öppnas ju denna i webläsaren...
-Kan man förhindra detta, så man får upp dialogrutan istället där amn kan välja "spara" eller "öppna"?

-Även filnamnet blir ju konstigt... Mellansteg blir %20

Hoppas ni förstår...

Mvh
Henrik

Capture_35.jpgCapture_36.jpg
Medlem sedan jan. 20013 582 inlägg
#7

Hepp! :)

Fick ett tips om den här koden:

<%
If request.Form("supplier") <> "" then

	'Definiera variabler
	dim objConn, objRS, sSQL, fsObj, tfile, iSupplierId, sUnit, sEndChar, sPath, sFileName, sSupplierName, iCounter
	
	iCounter = 0
	
	'Ta emot data
	iSupplierId = cint(request.Form("supplier"))
	
	'Sätta variabler
	sEndChar = "X"
	sPath = "/createTextFiles/filesForPalm/"
	
	'Funktion 
	function GetFixedWidthString(stringVal,length)
	   GetFixedWidthString=left(stringVal & string(length," "),length)
	end function
	
	' Öppna databasen
	' ***************
	Set objConn = Server.CreateObject("ADODB.Connection")
	objConn.ConnectionString = Application("sConn")
	objConn.Open
	
	sSQL = "SELECT supplierName FROM tblSupplier Where supplierId = " & iSupplierId & ""
	Set objRS = objConn.Execute (sSQL)
	
	If not objRS.EOF then
		sSupplierName = objRS("supplierName")
	End If
	
	objRS.Close
	Set objRS = Nothing
	
	sFileName = sSupplierName & " - El.txt"
	
	set fsObj=Server.CreateObject("Scripting.FileSystemObject")
	set tfile=fsObj.CreateTextFile(server.MapPath(sPath & sFileName))
	
	tfile.WriteLine("[HEADER]")
	tfile.WriteLine("<Article.Nr>,8")
	tfile.WriteLine("<Article.Price>,8")
	tfile.WriteLine("<Article.Unit>,5")
	tfile.WriteLine("<Article.Name>,50")
	tfile.WriteLine("End,1")
	tfile.WriteLine("[DATA]")
	
	sSQL = 	"SELECT tblArticle.articlenumber, tblArticle.articleName, tblPrice.articlePrice, tblPrice.articleCategoryNumber, tblArticle.articleUnit, " &_
			"tblCategory.CategoryName, tblCategory.categoryNumber, tblDiscount.articleDiscount, tblSupplier.SupplierName, tblSupplier.SupplierId, " &_
			"CASE WHEN articleDiscount is null THEN articlePrice ELSE articlePrice*(1-([articleDiscount]*0.01)) END AS articlePriceWithDiscount " &_
			"FROM tblArticle " &_
			"INNER JOIN tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber " &_
			"INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId " &_
			"LEFT OUTER JOIN tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND tblPrice.articleSupplierId = tblDiscount.supplierId " &_
			"LEFT OUTER JOIN tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND tblPrice.articleCategoryNumber = tblCategory.categoryNumber " &_
			"WHERE tblSupplier.supplierId = " & iSupplierId & " and tblCategory.categoryNumber = '0101' " &_
			"ORDER BY tblArticle.articlenumber"
			
	Set objRS = Server.Createobject("ADODB.Recordset")
	objRS.Open sSQL, objConn, 1, 2
	
	' Räkneverk
	' *********
	Response.write("<div id=""message"">Vänta, skriver till databasen...</div>")
	Response.write("<div id=""progress""></div>")
	Response.Flush()
	
	Do while not objRS.EOF
		
		' Villkor för att flusha
		' **********************
		iCounter = iCounter +1
		if iCounter mod 10 = 0 then
			Response.write ("<script>document.getElementById(""progress"").innerHTML=""" & iCounter & """;</script>")
			Response.flush
		end if
		
		sArticleNumber = GetFixedWidthString(objRS("articleNumber"), 8)
		dArticlePrice = GetFixedWidthString(cdbl(objRS("articlePrice")), 8)
		sUnit = GetFixedWidthString(objRS("articleUnit"), 5)
		sArticleName = GetFixedWidthString(objRS("articleName"), 50)
		
		sLine = sArticleNumber & dArticlePrice & sUnit & sArticleName & sEndChar
		
		tfile.WriteLine(sLine)
		
		objRS.Movenext 
	Loop 
	
	objRS.Close
	Set objRS = Nothing
	
	tfile.close
	set tfile=nothing
	set fsObj=nothing
	
	response.redirect ("getFile.asp?file=" & sFileName)
Else
	Response.write "Du har försökt göra en otillåten åtgärd!"
End If
%>

Mottagande sida:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<%
sFile = request.querystring ("file")

Set objStream = CreateObject( "ADODB.Stream" ) 
objStream.Open objStream.Type = 1 
binary objStream.LoadFromFile server.mappath( "/filesForPalm/" & sFile ) 
Response.ContentType = "application/my-download"
Response.BinaryWrite objStream.Read(-1) 
read all 
Set objStream = nothing 
Response.End 
%>
<body>
</body>
</html>

..Men får då följande felmeddelande:

Response-objekt fel 'ASP 0156 : 80004005'

Fel på huvuden

/createTextFiles/createTextFilePalm.asp, rad 106

HTTP-huvudena har redan skrivits till klientläsaren. Ändringar till HTTP-huvudena måste göras innan sidinnehållet skrivs.

Rad 106 är:

response.redirect ("getFile.asp?file=" & sFileName)

Vad är fel...

Mvh
Henrik

Medlem sedan juni 200032 967 inlägg
#8

Du kan inte ha en massa html i sidan. Ta bort allt som inte har att göra med streamingen av filen.

Medlem sedan jan. 20013 582 inlägg
#9

@nders skrev:

Du kan inte ha en massa html i sidan. Ta bort allt som inte har att göra med streamingen av filen.

Jag testar att ta bort allt annat.... :)

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#10

Jag testade det, men med samma resultat... :(

<%
sFile = request.querystring ("file")

Set objStream = CreateObject( "ADODB.Stream" ) 
objStream.Open objStream.Type = 1 
binary objStream.LoadFromFile server.mappath( "/filesForPalm/" & sFile ) 
Response.ContentType = "application/my-download"
Response.BinaryWrite objStream.Read(-1) 
read all 
Set objStream = nothing 
Response.End 
%>

Vänta, skriver till databasen...
30
Response-objekt fel 'ASP 0156 : 80004005'

Fel på huvuden

/createTextFiles/createTextFilePalm.asp, rad 106

HTTP-huvudena har redan skrivits till klientläsaren. Ändringar till HTTP-huvudena måste göras innan sidinnehållet skrivs.

Vad är det för fel?

Mvh
Henrik

Medlem sedan juni 200032 967 inlägg
#11

rad 106?

du har ju c:a 10 rader i inlägget ovan...

Redigerar du fel fil som vanligt?

Medlem sedan jan. 20013 582 inlägg
#12

Shut up butt head... ;)

Rad 106 är:

response.redirect ("getFile.asp?file=" & sFileName)

I filen som skapar textfilen....

Mvh
Henrik

Medlem sedan juni 200032 967 inlägg
#13

Ok....

Man kan inte köra redirect (eller ändra andra headers) om man skrivit saker till webbläsaren. Då får man använda javascript.

Medlem sedan jan. 20013 582 inlägg
#14

Hmmmm.... ok

Hur gör man då?

Mvh
Henrik

Medlem sedan juni 200032 967 inlägg
#15

Öh

<script>location.href='foobar.asp';</script>

Glöm inte att lägga en response.end precis efter, annars körs ju resten av asp-sidan.

Medlem sedan jan. 20013 582 inlägg
#16

:r

Jaha det var så du menade.. sorry.... :)

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#17

Hmmm... efter mycket om och men så fungerar det nu.... :)

Jag klistrar in koden, så kan ni se hur jag gjort... anmärka på om något är fel.. eller berömma för att det är snyggt.. ;)

Mvh
Henrik

Sida som genererar textfilen:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<%
If request.Form("supplier") <> "" then

	'Definiera variabler
	dim objConn, objRS, sSQL, fsObj, tfile, iSupplierId, sUnit, sEndChar, sPath, sFileName, sSupplierName, iCounter
	
	iCounter = 0
	
	'Ta emot data
	iSupplierId = cint(request.Form("supplier"))
	
	'Sätta variabler
	sEndChar = "X"
	sPath = "/createTextFiles/filesForPalm/"
	
	'Funktion 
	function GetFixedWidthString(stringVal,length)
	   GetFixedWidthString=left(stringVal & string(length," "),length)
	end function
	
	' Öppna databasen
	' ***************
	Set objConn = Server.CreateObject("ADODB.Connection")
	objConn.ConnectionString = Application("sConn")
	objConn.Open
	
	sSQL = "SELECT supplierName FROM tblSupplier Where supplierId = " & iSupplierId & ""
	Set objRS = objConn.Execute (sSQL)
	
	If not objRS.EOF then
		sSupplierName = objRS("supplierName")
	End If
	
	objRS.Close
	Set objRS = Nothing
	
	sFileName = sSupplierName & " - El.txt"
	
	set fsObj=Server.CreateObject("Scripting.FileSystemObject")
	set tfile=fsObj.CreateTextFile(server.MapPath(sPath & sFileName))
	
	tfile.WriteLine("[HEADER]")
	tfile.WriteLine("<Article.Nr>,8")
	tfile.WriteLine("<Article.Price>,8")
	tfile.WriteLine("<Article.Unit>,5")
	tfile.WriteLine("<Article.Name>,50")
	tfile.WriteLine("End,1")
	tfile.WriteLine("[DATA]")
	
	sSQL = 	"SELECT tblArticle.articlenumber, tblArticle.articleName, tblPrice.articlePrice, tblPrice.articleCategoryNumber, tblArticle.articleUnit, " &_
			"tblCategory.CategoryName, tblCategory.categoryNumber, tblDiscount.articleDiscount, tblSupplier.SupplierName, tblSupplier.SupplierId, " &_
			"CASE WHEN articleDiscount is null THEN articlePrice ELSE articlePrice*(1-([articleDiscount]*0.01)) END AS articlePriceWithDiscount " &_
			"FROM tblArticle " &_
			"INNER JOIN tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber " &_
			"INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId " &_
			"LEFT OUTER JOIN tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND tblPrice.articleSupplierId = tblDiscount.supplierId " &_
			"LEFT OUTER JOIN tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND tblPrice.articleCategoryNumber = tblCategory.categoryNumber " &_
			"WHERE tblSupplier.supplierId = " & iSupplierId & " and tblCategory.categoryNumber = '0101' " &_
			"ORDER BY tblArticle.articlenumber"
			
	Set objRS = Server.Createobject("ADODB.Recordset")
	objRS.Open sSQL, objConn, 1, 2
	
	' Räkneverk
	' *********
	Response.write("<div id=""message"">Vänta, skriver till databasen...</div>")
	Response.write("<div id=""progress""></div>")
	Response.Flush()
	
	Do while not objRS.EOF
		
		' Villkor för att flusha
		' **********************
		iCounter = iCounter +1
		if iCounter mod 10 = 0 then
			Response.write ("<script>document.getElementById(""progress"").innerHTML=""" & iCounter & """;</script>")
			Response.flush
		end if
		
		sArticleNumber = GetFixedWidthString(objRS("articleNumber"), 8)
		dArticlePrice = GetFixedWidthString(cdbl(objRS("articlePrice")), 8)
		sUnit = GetFixedWidthString(objRS("articleUnit"), 5)
		sArticleName = GetFixedWidthString(objRS("articleName"), 50)
		
		sLine = sArticleNumber & dArticlePrice & sUnit & sArticleName & sEndChar
		
		tfile.WriteLine(sLine)
		
		objRS.Movenext 
	Loop 
	
	objRS.Close
	Set objRS = Nothing
	
	tfile.close
	set tfile=nothing
	set fsObj=nothing
	%>
	<script>location.href='getFile.asp?file=<% =sFileName %>';</script>
	<%
	Response.End()
Else
	Response.write "Du har försökt göra en otillåten åtgärd!"
End If
%>
<body>
</body>
</html>

Sida som visar dialogruta "öppna/Spara fil"

<%
sFile = request.querystring ("file")

Set objStream = CreateObject( "ADODB.Stream" ) 
objStream.Open 
objStream.Type = 1 
objStream.LoadFromFile server.mappath( "/createTextFiles/filesForPalm/" & sFile ) 
Response.ContentType = "application/my-download"
Response.AddHeader "Content-Disposition", "attachment; filename=" & sFile &""
Response.BinaryWrite objStream.Read(-1) 
Set objStream = nothing 
Response.End 
%>
262 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)