2013-08-19 2 views
2

Я разрабатываю приложение, в котором я хочу создать файл MS-EXCEL из приложения, вызвав службу, и я хочу вернуть этот файл в качестве ответа на клиентскую машину с диалоговым окном для сохранения файла.Как получить диалоговое окно выбора пути для сохранения файла с помощью GWT

В настоящее время я жестко кодирую путь в программе. Я не могу использовать swing, я хочу реализовать это в GWT.

 if (name.equalsIgnoreCase("DigitalInputReport")) {  
        response.setHeader(
               "Content-disposition", 
               "attachment; filename=\"DIR_" 
                 + TimeZoneUtil.getPdfDate(fromDate) + "_" 
                 + TimeZoneUtil.getPdfDate(toDate) + ".csv\""); 

     List<ReportData> datas = new ArrayList<ReportData>(); 
     // Calling Service 
     datas = fleetTrackingServiceImpl.getDIN2SummaryReport(vehicle, 
            fromDate, toDate); 

     FileWriter writer = new FileWriter("C:\\Windows\\Temp\\DIR_" 
               + TimeZoneUtil.getPdfDate(fromDate) + "_" 
               + TimeZoneUtil.getPdfDate(toDate) + ".csv"); 
             try { 
              hashMapRunDur = datas.get(datas.size() - 1).getRunHashMap(); 
              hashMapStopDur = datas.get(datas.size() - 1) 
                .getStopHashMap(); 
              int runDur = 0, stopDur = 0; 
              writer.append("From Hour"); 
              writer.append(','); 
              writer.append("To Hour"); 
              writer.append(','); 
              writer.append("Minutes ON"); 
              writer.append(','); 
              writer.append("Minutes OFF"); 
              writer.append(','); 
              writer.append('\n'); 
              writer.append("Date"); 
              writer.append(','); 
              String dtChk = null, dtChkPrev = null; 
              for (int i = 0; i < datas.size(); i++) { 

               if (i == 0) { 
                dtChk = datas.get(i).getToDate(); 
                writer.append(datas.get(i).getToDate()); 
                writer.append(','); 
                writer.append('\n'); 
                writer.append(datas.get(i).getRunTime()); 
                writer.append(','); 
                writer.append(datas.get(i).getStopTime()); 
                writer.append(','); 
                writer.append(datas.get(i).getRunDur()); 
                writer.append(','); 
                writer.append(datas.get(i).getStopDur()); 
                writer.append('\n'); 
               } else { 
                dtChkPrev = dtChk; 
                dtChk = datas.get(i).getToDate(); 
                if (dtChkPrev.equals(dtChk)) { 
                 writer.append(datas.get(i).getRunTime()); 
                 writer.append(','); 
                 writer.append(datas.get(i).getStopTime()); 
                 writer.append(','); 
                 writer.append(datas.get(i).getRunDur()); 
                 writer.append(','); 
                 writer.append(datas.get(i).getStopDur()); 
                 writer.append('\n'); 
                } else { 
                 for (Map.Entry<String, String> e : hashMapRunDur 
                   .entrySet()) { 
                  runDur = (Integer.valueOf(e.getValue())); 
                  stopDur = (Integer.valueOf(hashMapStopDur 
                    .get(e.getKey()))); 
                  break; 
                 } 
// To delete first entry 
       Iterator<Map.Entry<String, String>> iterRun = hashMapRunDur 
                   .entrySet().iterator(); 
                 while (iterRun.hasNext()) { 
                  Map.Entry<String, String> entry = iterRun 
                    .next(); 
                  if (datas.get(i - 1).getToDate() 
                    .equalsIgnoreCase(entry.getKey())) { 
                   iterRun.remove(); 
                  } 
                 } 
                 Iterator<Map.Entry<String, String>> iterStop = hashMapStopDur 
                   .entrySet().iterator(); 
                 while (iterStop.hasNext()) { 
                  Map.Entry<String, String> entry = iterStop 
                    .next(); 
                  if (datas.get(i - 1).getToDate() 
                    .equalsIgnoreCase(entry.getKey())) { 
                   iterStop.remove(); 
                  } 
                 } 
                 writer.append(' '); 
                 writer.append(','); 
                 writer.append("Total ON/OFF"); 
                 writer.append(','); 
                 writer.append(formatIntoHHMMSSWithOutDay(runDur)); 
                 writer.append(','); 
                 writer.append(formatIntoHHMMSSWithOutDay(stopDur)); 
                 writer.append(','); 
                 writer.append('\n'); 

                 dtChk = datas.get(i).getToDate(); 
                 writer.append("Date"); 
                 writer.append(','); 
                 writer.append(datas.get(i).getToDate()); 
                 writer.append(','); 
                 writer.append('\n'); 
                 writer.append(datas.get(i).getRunTime()); 
                 writer.append(','); 
                 writer.append(datas.get(i).getStopTime()); 
                 writer.append(','); 
                 writer.append(datas.get(i).getRunDur()); 
                 writer.append(','); 
                 writer.append(datas.get(i).getStopDur()); 
                 writer.append('\n'); 
                } 
                if (i == datas.size() - 1) { 
                 for (Map.Entry<String, String> e : hashMapRunDur 
                   .entrySet()) { 
                  runDur = (Integer.valueOf(e.getValue())); 
                  stopDur = (Integer.valueOf(hashMapStopDur 
                    .get(e.getKey()))); 
                  break; 
                 } 
                 writer.append(' '); 
                 writer.append(','); 
                 writer.append("Total ON/OFF"); 
                 writer.append(','); 
                 writer.append(formatIntoHHMMSSWithOutDay(runDur)); 
                 writer.append(','); 
                 writer.append(formatIntoHHMMSSWithOutDay(stopDur)); 
                 writer.append(','); 
                 writer.append('\n'); 
                } 
               } 

              } 
             } catch (IOException e) { 
              e.printStackTrace(); 
             } finally { 
              writer.flush(); 
              writer.close(); 
             } 
       } 

Это сервлет-кодирование. Когда я вызываю его, я получаю вывод здесь (c: // windows/temp/DIR _...) с полным содержимым, но не в файле, который я загружаю на стороне клиента (я получаю только «DigitalInputReport»). Пожалуйста, объясните мне, кратко ...

csvBtn.addSelectionListener(new SelectionListener<ButtonEvent>() { 

      @Override 
      public void componentSelected(ButtonEvent ce) { 
       String gwt = GWT.getHostPageBaseURL(); 
       Window.open(
         gwt 
           + "generateCSVServlet?name=DigitalInputReport&fromDate=" 
           + fromDate + "&toDate=" + toDate + "&compName=" 
           + LoginDashboardModule.companyId 
           + "&brnchName=" + LoginDashboardModule.branchId 
           + "&userName=" + LoginDashboardModule.userName 
           + "&selectedVehicle=" + selectedVehicle, null, null);    
      } 
     }); 

Это клиентский код

ответ

3
File temp = new File("C:\\Windows\\Temp\\DIR_" 
             + TimeZoneUtil.getPdfDate(fromDate) + "_" 
             + TimeZoneUtil.getPdfDate(toDate) + ".csv"); 

try (BufferedReader br = new BufferedReader(new FileReader(temp))) 
           { 
            String isCurrentLine; 
            while ((isCurrentLine = br.readLine()) != null) { 
             response.getOutputStream().write("\n".getBytes()); 
             byte[] b = isCurrentLine.getBytes(); 
             response.getOutputStream().write(b); 
            } 

           } catch (IOException e) { 
            e.printStackTrace(); 
           } 

Используя этот код можно непосредственно вернуть содержимое файла на стороне клиента с серверной стороне и сохранить файл на клиентскую машину с его желанием.

1

Используйте FileUpload, чтобы получить путь.

A widget that wraps the HTML <input type='file'> element. 

И ChangeEvent вы можете получить имя файла/путь:

FileUpload file = (FileUpload) event.getSource(); 
String filename = file.getFilename(); 
+0

На самом деле я создаю лист Excel со стороны сервера, и у меня нет никакого события в серверном коде. Кнопка в кодировке на стороне клиента. –

+1

Я не понимаю, хотите ли вы сохранить файл на сервере или на стороне клиента. Если клиентская сторона, вы можете получить имя файла от клиента, а затем сохранить файл excel, используя имя файла. Однако путь к сохранению управляется браузером пользователя. Вы не можете записать файл напрямую на абсолютный путь клиента. – criszhao

+0

@criszhao Я бы сказал, что он хочет сохранить файл, созданный на сервере, в другое место на сервере, но хочу, чтобы пользователь выбирал, где на сервере его сохранить. Ибадур, вероятно, вы должны изменить свой вопрос, чтобы очистить этот сервер/клиент – Piro