DownloadAttachmentAction.java

package org.itracker.web.actions.admin.attachment;

import org.apache.log4j.Logger;
import org.apache.struts.action.*;
import org.itracker.model.IssueAttachment;
import org.itracker.services.IssueService;
import org.itracker.web.actions.base.ItrackerBaseAction;
import org.itracker.web.util.ServletContextUtils;
import org.springframework.web.bind.ServletRequestUtils;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadAttachmentAction extends ItrackerBaseAction {

    private static final Logger log = Logger.getLogger(DownloadAttachmentAction.class);

    public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request,
                                 HttpServletResponse response) throws Exception {

        Integer attachmentID = ServletRequestUtils.getIntParameter(request, "id");

        IssueService issueService = ServletContextUtils.getItrackerServices().getIssueService();

        IssueAttachment attachment = issueService.getIssueAttachment(attachmentID);

        if (attachment.getFileData() == null) {
            ActionMessages errors = new ActionMessages();

            errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("itracker.web.error.missingattachmentdata"));

            saveErrors(request, errors);

            return actionMapping.findForward("error_page");
        }

        response.setContentType(attachment.getType());
        response.setHeader("Content-Disposition", "attachment; filename=" + attachment.getOriginalFileName() + "");
        ServletOutputStream outputStream = response.getOutputStream();
        log.debug("Displaying attachment " + attachment.getId() + " of type " + attachment.getType()
                + " to client.  Attachment size: " + attachment.getFileData().length);

        outputStream.write(attachment.getFileData());

        return null;

    }

}