--- /dev/null
+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.eclipse.ui.specific;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletResponse;
+
+import org.argeo.ArgeoException;
+import org.eclipse.rwt.RWT;
+import org.eclipse.rwt.service.IServiceHandler;
+
+public class DownloadServiceHandler implements IServiceHandler {
+
+ private FileProvider provider;
+
+ public DownloadServiceHandler(FileProvider provider) {
+ this.provider = provider;
+ }
+
+ public void service() throws IOException, ServletException {
+ // Which file to download?
+ String fileName = RWT.getRequest().getParameter("filename");
+ String fileId = RWT.getRequest().getParameter("fileid");
+
+ // Get the file content
+ byte[] download = provider.getByteArrayFileFromId(fileId);
+
+ // Send the file in the response
+ HttpServletResponse response = RWT.getResponse();
+ response.setContentType("application/octet-stream");
+ response.setContentLength(download.length);
+ String contentDisposition = "attachment; filename=\"" + fileName + "\"";
+ response.setHeader("Content-Disposition", contentDisposition);
+
+ // Various header fields that can be set to solve some issues with some
+ // old browsers.
+ // Unused.
+ // String contentType = "application/force-download; name=\"" + fileName
+ // + "\"";
+ // response.setContentType(contentType);
+ // response.setHeader("Content-Transfer-Encoding", "binary");
+ // response.setHeader("Pragma", "no-cache");
+ // response.setHeader("Cache-Control", "no-cache, must-revalidate");
+ // response.setHeader("Expires", "0");
+ // response.setHeader("Connection", "Keep-Alive");
+ // response.setHeader("Keep-Alive", "timeout=5, max=86");
+ // response.setHeader("transfer-Encoding", "chunked");
+
+ try {
+ response.getOutputStream().write(download);
+ } catch (IOException ioe) {
+ throw new ArgeoException("Error while writing the file " + fileName
+ + " to the servlet response", ioe);
+ }
+ }
+}