Here i show a simple java example to demonstrate how to let user download a file from website. No matter you are using struts , JSP, Spring or whatever other java framework, the logic is same.
1) First we have to set HttpServletResponse response to tell browser about system going to return an application file instead of normal html page
response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=downloadfilename.csv");
we can also specified a download file name in attachment;filename=, above example export a csv file name “downloadfilename.csv” for user download.
2) There have 2 ways to let user download a file from website
Read file from physical location
File file = new File("C:\\temp\\downloadfilename.csv"); FileInputStream fileIn = new FileInputStream(file); ServletOutputStream out = response.getOutputStream(); byte[] outputByte = new byte[4096]; //copy binary contect to output stream while(fileIn.read(outputByte, 0, 4096) != -1) { out.write(outputByte, 0, 4096); } fileIn.close(); out.flush(); out.close();
Export database data or string directly to InputStream for user download.
StringBuffer sb = new StringBuffer("whatever string you like"); InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8")); ServletOutputStream out = response.getOutputStream(); byte[] outputByte = new byte[4096]; //copy binary contect to output stream while(in.read(outputByte, 0, 4096) != -1) { out.write(outputByte, 0, 4096); } in.close(); out.flush(); out.close();
3) Done
Here i show my struts example to demonstrate how to directly write data into InputStream and output it as “temp.cvs” to let user download.
public ActionForward export(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //tell browser program going to return an application file instead of html page response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition","attachment;filename=temp.csv"); try { ServletOutputStream out = response.getOutputStream(); StringBuffer sb = generateCsvFileBuffer(); InputStream in = new ByteArrayInputStream(sb.toString().getBytes("UTF-8")); byte[] outputByte = new byte[4096]; //copy binary contect to output stream while(in.read(outputByte, 0, 4096) != -1) { out.write(outputByte, 0, 4096); } in.close(); out.flush(); out.close(); } return null; } private static StringBuffer generateCsvFileBuffer() { StringBuffer writer = new StringBuffer(); writer.append("DisplayName"); writer.append(','); writer.append("Age"); writer.append(','); writer.append("HandPhone"); writer.append('\n'); writer.append("mkyong"); writer.append(','); writer.append("26"); writer.append(','); writer.append("0123456789"); writer.append('\n'); return writer; }
Here’s a file download example in Servlet code



[...] Here’s another file download example in Struts [...]
From my web layer i pass an id value, then a type value(string), and two ate values….
Actually i useed an Http service and sent these parameters using send() method to the EJB…
Here’s a simple Servlet to download file, hope help
http://www.mkyong.com/servlet/servlet-code-to-download-the-text-file-java/
From your reply, it’s look like you are using adobe flex. Sorry, i have no experience in flex, may be there have a flex’s way to do it. Please try find in Google, here are few examples in general java web application, hope it help.
General Java Serlvet
————————
http://www.java2s.com/Code/Java/Servlets/GetoutputstreamfromHttpServletResponse.htm
Struts example
—————–
http://www.allapplabs.com/struts/struts_example.htm
Thx Yong
The code look like a service layer, please get the HttpServletResponse object from web layer and pass it to your service layer, every web application must contains HttpServletResponse object.
Thx Yong
But cud u plz tel me hw to pass the response object from web layer? Can you explain it briefly using an example??
When i use response.setContentType statement ,
it says response has not been initialized….
I have changed the writer to StringBuffer Type..
So tat is not the issue
Hi,
Sorry for the delay.
Plz find my code below. It is givin an exception. This code is in a Session Bean. The input is coming from Flex. Iam able to generate the file, but not able to make it available as a downloadable file
Could you plz help me out…
Its kinda urgent…..
Thx in Advance…
Also i would appreciate if this code isnt made public….
Also iam new to httprequest and response part…
Plz enligten me on wat i shud be sending in the request, from wer i shud be sending the request and wat response shud hold….
Code:
public void exportPowerData(int id,String type,String from,String to)
{
………………….
String sFileName = “c:\\test.csv”;
response.setContentType(“application/octet-stream”);
response.setHeader(“Content-Disposition”,”attachment;filename=sFileName”);
Date fromTimeStamp = stringToDate(from);
Date toTimeStamp = stringToDate(to);
System.out
.println(“INFO:************* Executing EJB ********************** “);
Session session = HibernateUtil.getSessionFactory().openSession();
Criteria crit =
session.createCriteria(Power.class);
crit.add(Restrictions.between(“lastUpdatedOn”, new Date(fromTimeStamp.getTime()), new Date(toTimeStamp.getTime())));
List list = crit.list();
FileWriter writer = new FileWriter(sFileName);
writer.append(“Dc_Equipment”);
writer.append(‘,’);
writer.append(“Equipment Type”);
writer.append(‘,’);
writer.append(“Last_UpdatedOn”);
writer.append(‘,’);
writer.append(“Power(In Watts)”);
writer.append(‘\n’);
for(Iterator it = list.iterator();it.hasNext();)
{
Power p = (Power)it.next();
System.out.println(“Home: ” + p.getHome());
System.out.println(“Type: ” + p.getType());
System.out.println(“Last_Updated_On: ” + p.getLastUpdatedOn());
System.out.println(“Power: ” + p.getValue());
String str = p.getHome();
String str1 = p.getType();
String str2 = p.getLastUpdatedOn();
String str3 = p.getValue();
double d = Double.valueOf(str3).doubleValue();
total_power = d+total_power;
String dbl_to_str = Double.toString(d);
writer.append(str);
writer.append(‘,’);
writer.append(str1);
writer.append(‘,’);
writer.append(str2);
writer.append(‘,’);
writer.append(dbl_to_str);
writer.append(‘\n’);
}
System.out.println(“Total Power Consumed:” +total_power);
String dbl_to_str1 = Double.toString(total_power);
writer.append(“Total Power: “);
writer.append(dbl_to_str1);
writer.append(“\n”);
FileInputStream fileIn = new FileInputStream(sFileName);
ServletOutputStream out = response.getOutputStream();
byte[] outputByte = new byte[4096];
//copy binary content to output stream
while(fileIn.read(outputByte, 0, 4096) != -1)
{
out.write(outputByte, 0, 4096);
}
fileIn.close();
out.flush();
out.close();
//fileDownload(writer);
writer.flush();
writer.close();
session.clear();
transaction.commit();
session.close();
HibernateUtil.shutDown();
//return null;
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public Date stringToDate(String value)
{
try
{
DateFormat formatter ;
Date date ;
formatter = new SimpleDateFormat(“yyyy-MM-dd”);
date = (Date)formatter.parse(value);
return date;
} catch (ParseException e)
{System.out.println(“Exception :”+e);
return null;
}
}
public static void main(String args[])
{
ExportDataEJB obj = new ExportDataEJB();
obj.exportPowerData(1, “Home”, “2009-10-30″, “2009-11-06″);
}
Hi,
Wat are these parameters (HttpServletRequest request, HttpServletResponse response) carrying? I tried to create an execute() function withe two parameters and then cal this function from main. But when i run it it is showin error.
Code:
public static void main(String[] args){
execute(null, null);
}
public static void execute(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated constructor stub
response.setContentType(“application/octet-stream”);
response.setHeader(“Content-Disposition”,”attachment;filename=temp.csv”);
……………………….
i have errors at the function call and response.setContentType statement it says exception….
when i run it, it says nullpointer exception….
i know ther error is due to the null values tat im passing to execute method.
But im not sure hw to overcome????
what’s your java web framework?
http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpServletRequest.html
Im using Struts….
But this part of the code is in a EJB session bean…
I’m not really familiar with either EJB2 nor EJB3,so not much comment on here, just get your HttpServletRequest in struts and pas to your EJB , it’s should be easily to get it, check your struts API documentation.
If you want more detail, please send me your source code
I have a session bean wer i generate a file. Can i make it available for download? Can i use the same code in this session bean?
yes, the codes are pure java, no hidden secrets there
Thx
Hi All,
Forgiv ma ignorance, but wat are these
(ActionMapping mapping, ActionForm form) parameters for????
ActionMapping mapping and ActionForm form are example in struts
Thanks very much for the code. It works great for me.
But I think there is a little bug in the binary download file code.
If the file size is not a multiple of 4096, the last loop (at the end of the file) would carry over data from the previous loop and write it one more time in the output stream.
Hi All,
theres is a requirement to export the csv file, file name contains the UTF-8 charecters..
Pls help me
There is no need to split the string into bytes and then write it to the output stream. You should explain the reason you do this because it doesn’t make sense and its error prone.
Instead of :
InputStream in = new ByteArrayInputStream(sb.toString().getBytes(“UTF-8″));
byte[] outputByte = new byte[4096];
//copy binary contect to output stream
while(in.read(outputByte, 0, 4096) != -1)
{
out.write(outputByte, 0, 4096);
}
Just do the following:
out.print(sb);
Much much better.
thanks for tips
sorry for that, i’m just used to this binary copy method to copy anything~
it was amazing…. you are genius thank you so much. whole concept was crystal clear..
hope help
Hi,
I want to download a file which is in another website and I can download it by going into that site and by clicking on download button. What I want is I don’t want to download it like this, instead I want a script which goes to that page and downloads the file and saves in the location which I have mentioned in the script. Also it should download the file in every 2 mins. Can you please help me in doing this?
you want a program to download a file from another website and save into your pc location? is this what you means? Yes, it is possible in java, java socket can achieve it.
Howeber i will suggest you to use java HttpClient library and regular expression to extract the website content.
[...] Original post by mkyong [...]