2010-01-23 18 views
8

Chcę dać plik do pobrania za pomocą java, struts2 i ajax.Pobieranie pliku za pomocą Java, Struts 2 i AJAX

Na mojej stronie html znajduje się przycisk o nazwie "eksport" kliknięcie, na którym zostanie wywołane wywołanie ajax, które wykona zapytanie i utworzy plik .xls za pomocą kodu i chcę przekazać ten plik do pobrania użytkownikowi bez przechowywania to na dysku twardym.

Czy ktoś wie, jak to zrobić, używając struts2 i ajax w java?

Czy jest dostępny przykład?

Daj mi znać, jeśli potrzebujesz więcej szczegółów ze mną ...

Dzięki.

amar4kintu

Odpowiedz

11

Nie trzeba używać AJAX w tym przypadku. Po prostu przycisk prześlij formularz do akcji Struts i pozwól, aby akcja działała na typ stream result.

Przykład:

W swojej XML Struts:

<result name="download" type="stream"> 
    <param name="contentDisposition">attachment;filename=report.xls</param> 
    <param name="contentType">application/vnd.ms-excel</param> 
    <param name="inputName">inputStream</param> 
    <param name="bufferSize">1024</param> 
</result> 

Twoje działanie będzie wówczas zapewnić public InputStream getInputStream() przekazać wraz z danymi.

Zakładam, że jakakolwiek biblioteka, której używasz do generowania plików Excel (POI?), Może zapisać dane wyjściowe do dowolnej wartości OutputStream.

Szybkie i-brudny sposób przekonwertować że do InputStream:

// Using Workbook from Apache POI for example... 
Workbook wb; 
// ... 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
wb.write(bos); 
InputStream bis = new ByteArrayInputStream(bos.toByteArray()); 
+0

Witam, kładę follwing w moim struts.xml \t \t \t \t \t contenttype aplikacja/vnd.ms-Excel \t \t \t \t \t \t Filestream \t \t \t \t \t \t mocujący, nazwa pliku = report.xls \t \t \t \t \t \t 1024 \t \t Teraz postępowałem zgodnie z twoimi instrukcjami, ale daje on plik do pobrania z nazwą akcji, która jest ExportReport.action zamiast z raportu.xls Jaki powinien być powód? – amar4kintu

+0

Używałeś MSIE? Przepuść nazwę pliku jako URL pathinfo lub użyj lepszej przeglądarki internetowej. – BalusC

+0

Używam firefox i powinien dać mi plik do pobrania jako report.xls, ale zamiast tego daje mi ExportReport.action do pobrania. i jeśli zmienię nazwę na report.xls. Pokazuje doskonały plik .xls, który eksportuję. Czy ktoś może powiedzieć, czego mi brakuje? – amar4kintu

0

ATLAST, udało mi się go rozwiązać w następujący sposób .. napisałem następujący wiersz w mojej funkcji klasy działania i byłem można pobrać plik o nazwie report.xls zamiast ExportReport.action. Nie wiem dokładnie ... dlaczego?

response.setHeader("Content-Disposition","attachment;filename=rpt.xls"); 

Poniżej znajduje się w moim pliku struts.xml. Usunąłem z niego parametr <contentDispositin>, ponieważ nie działał on z pliku struts.xml i umieściłem go w pliku Action Java, jak wyżej.

Mam nadzieję, że to pomoże komuś.

Dzięki.

amar4kintu

0

użyję tego rodzaju adnotacji na klasy działania:

@Result(name = "success", type= StreamResult.class, 
      params = {"contentType", "application/vnd.ms-excel", 
        "contentDisposition", "attachment; filename=report.xls"}, 
      value = "reportFileStream" 
) 
2

W nawiązaniu do pytania amar4kintu za dotyczących plików zapisanych jako ExportReport.action zamiast report.xls, dzieje się to w IE, jeśli poniższy format nie jest przestrzegany w twoich rozpórkach.plik xml:

<result name="download" type="stream"> 
     <param name="contentDisposition">attachment;filename="${flashcardSetBean.title}.xlsx"</param> 
     <param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param> 
     <param name="inputName">inputStream</param> 
     <param name="bufferSize">1024</param> 
</result> 

Wydaje się, że linia w szczególności contentDisposition musi oznaczać, że plik jest przywiązanie i że nazwa pliku jest w cudzysłowie.

2

tylko w celach informacyjnych, możemy zrobić to samo przy użyciu adnotacji:

public class MyAction { 
    private InputStream fileInputStream; 
    private String logoName; 

    @Action(value="/downloadLogo", 
     results={ 
      @Result(name="success", type="stream", 
      params = { 
        "contentType", "application/image/gif", 
        "inputName", "fileInputStream", 
        "contentDisposition", "filename=\"${logoName}\"", 
        "bufferSize", "1024" 
      }) 
     }   
    )  
    public String downloadLogo() throws Exception { 
     logoName = "test.jpg"; 
      fileInputStream = new FileInputStream(new File("DirePath", logoName)); 
    } 
} 
0

Lepszym podejściem do outstream rury do InputStream jest wyjaśnione poniżej as opposed to the response by ZoogieZork above

InputStream is = new PipedInputStream(); 
PipedOutputStream out = new PipedOutputStream((PipedInputStream) is); 
wb.write(out); 

Zaletą tej metody jest to, że cały bufor nie jest przechowywany w pamięci, ale jest raczej podłączony za pomocą małego wewnętrznego bufora kołowego. Jest to lepsze zarówno pod względem pamięci, jak i narzutów na procesor.

referencyjne: Convert a Java OutputStream to an InputStream

Powiązane problemy