public void downloadFromDropbox(String fileName, DbxClient dbxClient)
      throws DbxException, IOException {
    FileOutputStream outputStream = new FileOutputStream(fileName);
    try {
      DbxEntry.File downloadedFile = dbxClient.getFile("/" + fileName, null, outputStream);

      System.out.println("Metadata: " + downloadedFile.toString());
    } finally {
      outputStream.close();
    }
  }
  public void doBrowse(HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException {
    if (!common.checkGet(request, response)) return;
    User user = common.getLoggedInUser(request);
    if (user == null) {
      common.pageSoftError(response, "Can't do /browse.  Nobody is logged in.");
      return;
    }

    DbxClient dbxClient = requireDbxClient(request, response, user);
    if (dbxClient == null) return;

    // Make sure the path starts with '/'.  There are probably other checks we can perform...
    String path = request.getParameter("path");
    if (path == null) {
      path = "/";
    } else {
      String pathError = DbxPath.findError(path);
      if (pathError != null) {
        response.sendError(400, "Invalid path: " + jq(path) + ": " + pathError);
        return;
      }
    }

    // Get the folder listing from Dropbox.
    DbxEntry.WithChildren listing;
    try {
      listing = dbxClient.getMetadataWithChildren(path);
    } catch (DbxException ex) {
      common.handleDbxException(response, user, ex, "getMetadataWithChildren(" + jq(path) + ")");
      return;
    }

    if (listing == null) {
      response.sendError(400, "Path doesn't exist on Dropbox: " + jq(path));
    }

    FormProtection fp = FormProtection.start(response);

    response.setContentType("text/html");
    response.setCharacterEncoding("utf-8");
    PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), UTF8));

    out.println("<html>");
    out.println("<head><title>" + escapeHtml4(path) + "- Web File Browser</title></head>");
    out.println("<body>");
    fp.insertAntiRedressHtml(out);

    out.println("<h2>Path: " + escapeHtml4(path) + "</h2>");

    if (listing == null) {
      out.println("<p>Nothing here...</p>");
    }
    // Folder
    else if (listing.entry instanceof DbxEntry.Folder) {
      // Upload form
      out.println("<form action='/upload' method='post' enctype='multipart/form-data'>");
      fp.insertAntiCsrfFormField(out);
      out.println("<label for='file'>Upload file:</label> <input name='file' type='file'/>");
      out.println("<input type='submit' value='Upload'/>");
      out.println(
          "<input name='targetFolder' type='hidden' value='"
              + escapeHtml4(listing.entry.path)
              + "'/>");
      out.println("</form>");
      // Listing of folder contents.
      out.println("<ul>");
      for (DbxEntry child : listing.children) {
        out.println(
            "  <li><a href='/browse?path="
                + escapeHtml4(child.path)
                + "'>"
                + escapeHtml4(child.name)
                + "</a></li>");
      }
      out.println("</ul>");
    }
    // File
    else {
      DbxEntry.File f = (DbxEntry.File) listing.entry;
      out.println("<pre>");
      out.print(escapeHtml4(f.toStringMultiline()));
      out.println("</pre>");
    }

    out.println("</body>");
    out.println("</html>");

    out.flush();
  }
  public void doUpload(HttpServletRequest request, HttpServletResponse response)
      throws IOException, ServletException {
    if (!common.checkPost(request, response)) return;
    User user = common.requireLoggedInUser(request, response);
    if (user == null) return;

    DbxClient dbxClient = requireDbxClient(request, response, user);
    if (dbxClient == null) return;

    try {
      request.getParts(); // Just call getParts() to trigger the too-large exception.
    } catch (IllegalStateException ex) {
      response.sendError(400, "Request too large");
      return;
    }

    String targetFolder = slurpUtf8Part(request, response, "targetFolder", 1024);
    if (targetFolder == null) return;

    Part filePart = request.getPart("file");
    if (filePart == null) {
      response.sendError(400, "Field \"file\" is missing.");
      return;
    }
    String fileName = filePart.getName();
    if (fileName == null) {
      response.sendError(400, "Field \"file\" has no name.");
      return;
    }

    // Upload file to Dropbox
    String fullTargetPath = targetFolder + "/" + fileName;
    DbxEntry.File metadata;
    try {
      metadata =
          dbxClient.uploadFile(
              fullTargetPath, DbxWriteMode.add(), filePart.getSize(), filePart.getInputStream());
    } catch (DbxException ex) {
      common.handleDbxException(response, user, ex, "uploadFile(" + jq(fullTargetPath) + ", ...)");
      return;
    } catch (IOException ex) {
      response.sendError(400, "Error getting file data from you.");
      return;
    }

    // Display uploaded file metadata.
    response.setContentType("text/html");
    response.setCharacterEncoding("utf-8");
    PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8"));

    out.println("<html>");
    out.println("<head><title>File uploaded: " + escapeHtml4(metadata.path) + "</title></head>");
    out.println("<body>");
    out.println("<h2>File uploaded: " + escapeHtml4(metadata.path) + "</h2>");
    out.println("<pre>");
    out.print(escapeHtml4(metadata.toStringMultiline()));
    out.println("</pre>");
    out.println("</body>");
    out.println("</html>");

    out.flush();
  }