2015-03-16 3 views
0
String fileName = "/CSVLogs/test"; 
     String fileType = "csv"; 
     resp.setContentType(fileType); 

     resp.setHeader("Content-disposition","attachment; filename=test.csv"); 

     File my_file = new File(fileName); 

     OutputStream out = resp.getOutputStream(); 
     FileInputStream in = new FileInputStream(my_file); 
     byte[] buffer = new byte[4096]; 
     int length; 
     while ((length = in.read(buffer)) > 0){ 
      out.write(buffer, 0, length); 
     } 
     in.close(); 
     out.flush(); 

Мне нужно, чтобы загрузить файл CSV, но это, кажется, вернуться "java.lang.IllegalStateException: ПИСАТЕЛЬ"Скачать CSV-файл в Java Servlet

<form enctype="multipart/form-data" action="/TestServlet/ConfigServlet?do=downloadLogs" method="post" style="height:68px;"> 

UPDATE

resp.setContentType("application/octet-stream"); 
      try 
      { 
       OutputStream outputStream = resp.getOutputStream(); 
       InputStream in = StorageUtil.getInstance().getFile("/CSVLogs/test.csv").getInputStream(); 
      /* InputStream in = StorageUtil.getInstance().getCSVLogsZip().getInputStream();*/ 
       byte[] buffer = new byte[4096]; 
       int length; 
       while ((length = in.read(buffer)) > 0){ 
        outputStream.write(buffer, 0, length); 
        in.close(); 
        outputStream.flush(); 
       } 
      } 
      catch(Exception e) { 
       System.out.println(e.toString()); 
      } 

Я все еще получаю ту же ошибку. java.lang.IllegalStateException: ПИСАТЕЛЬ

(пьяным) Почему я получаю эту ошибку> _ <

+0

вы обсудить всю информацию исключения? Я имею в виду, что произошло исключение строки. –

+0

происходит в getOutputStream() –

+0

после полной трассировки стека – Baby

ответ

0

Попробуйте это:

response.setContentType("application/x-rar-compressed"); 
response.setHeader("Content-Disposition", "attachment; filename=\"test.csv\""); 

Для записи файла в OutputStream, попробуйте следующее

FileInputStream fis = new FileInputStream("your_csv_file.csv"); 
byte[] b = new byte[fis.available()]; 
outputStream.write(b); 
outputStream.flush(); 
outputStream.close(); 
+0

все тот же. :( –

+0

Использовать BufferedOutputStream вместо OutputStream как: BufferedOutputStream bout = new BufferedOutputStream (resp.getOutputStream()); –

+0

Почему вы закрываете входной поток внутри своего цикла while.move, что часть outsinde и записывает его в конце. Ваша проблема решена? –

1

Попробуйте следующее:

public void doGet(HttpServletRequest request, HttpServletResponse response) 
{ 
response.setContentType("text/csv"); 
response.setHeader("Content-Disposition", "attachment; filename=\"test.csv\""); 
try 
{ 
    OutputStream outputStream = response.getOutputStream(); 
    FileInputStream in = new FileInputStream(my_file); 
    byte[] buffer = new byte[4096]; 
    int length; 
    while ((length = in.read(buffer)) > 0){ 
     outputStream.write(buffer, 0, length); 
in.close(); 
    outputStream.flush(); 
    } 
} 
catch(Exception e) 
{ 
    model.closeConnection(); 
    System.out.println(e.toString()); 
    } 
} 
+0

использовал этот код, но я все равно получаю ту же ошибку. WHYYYYYY :((проверить мое редактирование) –

+0

resp.setContentType ("application/octet-stream"); ​​ Почему это? –

1

Код java/сервлета, который вы предоставили, отлично работает. я называю сервлета CSVD, как показано ниже:

< form enctype="multipart/form-data" action="CSVD" method="post" style="height:68px;"> 
<input type="submit" value="submit" /> 
< /form> 

или через якорь таким образом < A HREF = "/ CSVDownloadApp/CSVD"> нажмите здесь, чтобы загрузить CSV </а>

возможно ваша ошибка подходит по другой причине.

1
public void downloadFile(HttpServletResponse response){ 
    String sourceFile = "c:\\source.csv"; 
    try { 
     FileInputStream inputStream = new FileInputStream(sourceFile); 
     String disposition = "attachment; fileName=outputfile.csv"; 
     response.setContentType("text/csv"); 
     response.setHeader("Content-Disposition", disposition); 
     response.setHeader("content-Length", String.valueOf(stream(inputStream, response.getOutputStream()))); 

    } catch (IOException e) { 
     logger.error("Error occurred while downloading file {}",e); 
    } 
} 

И метод потока должен быть таким.

private long stream(InputStream input, OutputStream output) throws IOException { 

try (ReadableByteChannel inputChannel = Channels.newChannel(input); WritableByteChannel outputChannel = Channels.newChannel(output)) { 
    ByteBuffer buffer = ByteBuffer.allocate(10240); 
    long size = 0; 

    while (inputChannel.read(buffer) != -1) { 
     buffer.flip(); 
     size += outputChannel.write(buffer); 
     buffer.clear(); 
    } 
    return size; 
} 

}

+1

Если CSV-файл создан и хранится на сервере, то выше метод будет работать ... Nice Answer:) –