Download en fil fra sql 2008 database
HejJeg har ledt hele dagen for at finde ud af hvordan jeg downloader en fil fra databasen. Tabellen ser således ud
CREATE TABLE [dmbd_owner].[testFiles](
[id] [tinyint] NOT NULL,
[type] [varchar](3) NOT NULL,
[file] [varbinary](max) NOT NULL
)
==============================================================
Siden jeg uploader filen mer er følgende
==============================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@page language="java" contentType="text/html; charset=ISO-8859-1"%>
<%@ page import="java.util.*, java.io.*, java.sql.*, test.*, java.text.NumberFormat, java.lang.reflect.InvocationTargetException" %>
<%@page import="test.*"%>
<html>
<head>
<title>run</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="GENERATOR" content="Rational Application Developer">
</head>
<body>
<form action="run.jsp" method="POST">
<input type="file" name="attach"><br>
<input type="Submit" value="Upload File"><br>
</form>
<%
if (request.getParameter("attach") != null) {
Connection conn = forbindelse.getConnection();
String path = request.getParameter("attach");
out.write("\nPath: " + path);
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO dmbd_owner.testFiles VALUES (?,?,?)");
pstmt.setInt(1, 11);
pstmt.setString(2, "aa");
File fBlob = new File(path);
FileInputStream is = new FileInputStream (fBlob);
pstmt.setBinaryStream(3, is, (int) fBlob.length() );
pstmt.execute();
out.write("\nINDSAT FIL");
}
%>
</body>
</html>
==============================================================
Og måden jeg downloader på er følgende:
==============================================================
<%@ page import="java.io.*,java.util.*,java.sql.*" %>
<%
int id=0;
if(request.getParameter("id")!=null && request.getParameter("id")!="")
{
id = Integer.parseInt(request.getParameter("id").toString());
}
String connectionURL = "jdbc:mysql://localhost/application";
String url=request.getParameter("WEB_URL");
String Content=new String("");
Statement stmt=null;
Connection con=null;
try
{
String filename="data"+id+".txt";
//Class.forName("com.mysql.jdbc.Driver").newInstance();
con=dmbd.DBcon.getConnection();
stmt=con.createStatement();
String qry = "SELECT * FROm dmbd_owner.testFiles WHERE id="+id;
ResultSet rst= stmt.executeQuery(qry);
if(rst.next())
{
Content=rst.getString("file");
}
out.println(Content);
byte requestBytes[] = Content.getBytes();
ByteArrayInputStream bis = new ByteArrayInputStream(requestBytes);
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition","attachment; filename=" +filename);
byte[] buf = new byte[1024];
int len;
while ((len = bis.read(buf)) > 0){
response.getOutputStream().write(buf, 0, len);
}
bis.close();
response.getOutputStream().flush();
}
catch(Exception e){
e.printStackTrace();
}
%>
==============================================================
Jeg har aldrig leget med upload/download før så ved ikke om det er i upload fasen den faktisk fejler.
min kode fejler "lidt", dvs. får mulighed for at downloade fil, men får også følgende
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:596)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:186)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
Filen jeg henter indeholder:
544553542046494C2054494C20646F776E6C6F6164
Hvor der skulle stå en meget simpel text skrevet i TXT.
Funktionen skal kunne håndterer alle slags filer.
