final FormPanel form = new FormPanel();
form.setAction(UPLOAD_ACTION_URL);
// Because we're going to add a FileUpload widget, we'll need to set
the
// form to use the POST method, and multipart MIME encoding.
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
// Create a panel to hold all of the form widgets.
VerticalPanel panel = new VerticalPanel();
form.setWidget(panel);
// Create a TextBox, giving it a name so that it will be submitted.
final TextBox tb = new TextBox();
tb.setName("textBoxFormElement");
panel.add(tb);
// Create a FileUpload widget.
final FileUpload upload = new FileUpload();
upload.setName("uploadFormElement");
panel.add(upload);
// Add a 'submit' button.
panel.add(new Button("Submit", new ClickHandler() {
public void onClick(ClickEvent event) {
form.submit();
}
}));
// Add an event handler to the form.
form.addSubmitHandler(new FormPanel.SubmitHandler() {
public void onSubmit(SubmitEvent event) {
// This event is fired just before the form is submitted. We can
// take this opportunity to perform validation.
//if (tb.getText().length() == 0) {
//Window.alert("The text box must not be empty");
//event.cancel();
//}
}
});
form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
public void onSubmitComplete(SubmitCompleteEvent event) {
// When the form submission is successfully completed, this
// event is fired. Assuming the service returned a response of type
// text/html, we can get the result text here (see the FormPanel
// documentation for further explanation).
Window.alert(event.getResults());
FileName=upload.getFilename();
tb.setText(FileName);
}
});
RootPanel.get().add(form);
Servlet:
package de.tuberlin.pjel2009.server;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
/**
* servlet to handle file upload requests
*
*
*
*/
public class FileUploadServlet extends HttpServlet {
//private static final String UPLOAD_DIRECTORY = "d:\\uploaded\\";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse
resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse
resp)
throws ServletException, IOException {
// process only multipart requests
final String UPLOAD_DIRECTORY=req.getSession().getServletContext
().getRealPath("/")+ "job\\";
if (ServletFileUpload.isMultipartContent(req)) {
File tempDir = getTempDir(UPLOAD_DIRECTORY);
if (!tempDir.exists()) {
tempDir.mkdirs();
}
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
try {
List<FileItem> items = upload.parseRequest(req);
for (FileItem fileItem : items) {
// process only file upload
if (fileItem.isFormField()) continue;
String fileName = fileItem.getName();
// get only the file name not whole path
if (fileName != null) {
fileName = FilenameUtils.getName(fileName);
}
File uploadedFile = new File(UPLOAD_DIRECTORY, fileName);
if (uploadedFile.createNewFile()) {
fileItem.write(uploadedFile);
resp.setStatus(HttpServletResponse.SC_CREATED);
resp.getWriter().print("The file was created successfully.");
resp.flushBuffer();
} else
throw new IOException("The file already exists in repository.");
}
} catch (Exception e) {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"An error occurred while creating the file : " + e.getMessage
());
}
} else {
resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
"Request contents type is not supported by the servlet.");
}
}
private File getTempDir(String Dir) {
return new File(Dir);
}
we upload the file in a folder called job
on hyperlink or button --> download file from this folder
Can you give me an example to:
1) client-side
2) server-side
3) web.xml
Thanks!!
1) Send the file to an IFRAME or blank window or your application will
be stomped on.
2) IE will insist on opening files it knows how to open, even when you
want to download it.
I solved #1 with my DownloadIFrame class for GWT:
//////////////////////////////
import com.google.gwt.event.dom.client.HasLoadHandlers;
import com.google.gwt.event.dom.client.LoadEvent;
import com.google.gwt.event.dom.client.LoadHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Frame;
import com.google.gwt.user.client.ui.RootPanel;
public class DownloadIFrame extends Frame implements LoadHandler,
HasLoadHandlers {
public static final String DOWNLOAD_FRAME = "__gwt_downloadFrame";
public DownloadIFrame(String url) {
super();
setSize("0px", "0px");
setVisible(false);
RootPanel rp = RootPanel.get(DOWNLOAD_FRAME);
if (rp != null) {
addLoadHandler(this);
rp.add(this);
setUrl(url);
}
else
openURLInNewWindow(url);
}
native void openURLInNewWindow(String url) /*-{
$wnd.open(url);
}-*/;
public HandlerRegistration addLoadHandler(LoadHandler handler) {
return addHandler(handler, LoadEvent.getType());
}
public void onLoad(LoadEvent event) {
}
}
/////////////////////
I solve #2 with some headers I derived after much trial and error and
looking at other software like SquirrelMail:
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletUtils {
/**
* Sends headers to allow a file to be download to the workstation
vs.
* opened in the browser.
* @param fileName the name of the file. This will be encoded as
UTF-8.
* @param contentLen the length of the file, zero (0) if unknown.
* @param request the {@code HttpServletRequest}.
* @param response the {@code HttpSerletResponse}.
* @throws UnsupportedEncodingException
*/
public static void sendHeaders(String fileName, int contentLen,
HttpServletRequest request,
HttpServletResponse response)
throws UnsupportedEncodingException {
String ua = request.getHeader("User-Agent").toLowerCase();
boolean isIE = ((ua.indexOf("msie 6.0") != -1) ||
(ua.indexOf("msie 7.0") != -1)) ? true : false;
String encName = URLEncoder.encode(fileName, "UTF-8");
// Derived from Squirrel Mail and from
// http://www.jspwiki.org/wiki/BugSSLAndIENoCacheBug
if (request.isSecure()) {
response.addHeader("Pragma", "no-cache");
response.addHeader("Expires", "-1");
response.addHeader("Cache-Control", "no-cache");
}
else {
response.addHeader("Cache-Control", "private");
response.addHeader("Pragma", "public");
}
if (isIE) {
response.addHeader("Content-Disposition", "attachment; filename=\""
+
encName + "\"" );
response.addHeader("Connection", "close");
response.setContentType("application/force-download; name=\"" +
encName + "\"" );
}
else {
response.addHeader("Content-Disposition", "attachment; filename=\""
+
encName + "\"" );
response.setContentType("application/octet-stream; name=\"" +
encName + "\"" );
if (contentLen > 0)
response.setContentLength(contentLen);
}
}
}
///////////////////
The servlet for sending the file looks like:
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
// ... code to find your file... mine is a zip
// created earlier
FileInputStream zipIn = new FileInputStream( file );
// Send zero length, because this File.size() is a long, while
// HttpServletResponse.setContentLength() takes an int.
ServletUtils.sendHeaders(filename, 0, request, response);
ServletOutputStream out = response.getOutputStream();
response.setBufferSize( 8 * 1024 );
int bufSize = response.getBufferSize();
byte [] buffer = new byte[bufSize];
BufferedInputStream bis = new BufferedInputStream( zipIn,
bufSize );
int count;
while ( ( count = bis.read( buffer, 0, bufSize) ) != -1 ) {
out.write( buffer, 0, count );
}
bis.close();
zipIn.close();
out.flush();
out.close();
}
//////////////////////
The web.xml is straight forward"
<servlet>
<servlet-name>CopyObjectServlet</servlet-name>
<servlet-class>com.optix.web.server.CopyObjectServlet</servlet-
class>
</servlet>
...
<servlet-mapping>
<servlet-name>CopyObjectServlet</servlet-name>
<url-pattern>/webclient/copyObjectServlet</url-pattern>
</servlet-mapping>
////////////////////
Trigger this is your app however you wish--button, link, etc.:
String copyURL = GWT.getModuleBaseURL() +
"copyObjectServlet?param0=" + URL.encode(...);
new DownloadIFrame(printURL);