gikoha’s blog

個人的メモがわり

Roo file download

先日のAbookアプリに、ダウンロード機能をつけた
/abooks/vCard/{id} にアクセスすると、cardmeライブラリを使って作った String を、
test.vcf という名前で web browser から download させる。
eclipse内蔵web browserではうまく行かなかったが、外部からFirefoxを使ったらダウンロード
できた。Safariではなぜか test.vcf.txt という名前で保存されて TextEdit.appが立ち上がっちゃう。

AbookController.java

package abook.web;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import abook.main.Abook;
import org.springframework.roo.addon.web.mvc.controller.RooWebScaffold;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import info.ineighborhood.cardme.io.VCardWriter;
import info.ineighborhood.cardme.vcard.*;
import info.ineighborhood.cardme.vcard.errors.VCardError;
import info.ineighborhood.cardme.vcard.types.*;
import org.springframework.ui.Model;

@RooWebScaffold(path = "abooks", formBackingObject = Abook.class)
@RequestMapping("/abooks")
@Controller
public class AbookController
{
	static String getVCardString(Long id)
	{
		Abook person = Abook.findAbook(id);
		VCard vcard = new VCardImpl();

		vcard.setBegin(new BeginType());
		vcard.setVersion(new VersionType(VCardVersion.V3_0));
		vcard.setName(new NameType(person.getName()));
		vcard.setFormattedName(new FormattedNameType(person.getName()));
		AddressType addr = new AddressType();
		addr.setStreetAddress(person.getAddress());
		addr.setPostalCode(person.getPostalnum());
		vcard.addAddress(addr);
		vcard.addTelephoneNumber(new TelephoneType(person.getPhone()));
		vcard.setEnd(new EndType());

		VCardWriter writer = new VCardWriter();
		writer.setVCard(vcard);
		String vstring = writer.buildVCardString();
		return vstring;
	}

	@RequestMapping(value = "vCard/{id}", method = RequestMethod.GET)
	public void vCard2(HttpServletRequest request,
			HttpServletResponse response, @PathVariable("id") Long id)
			throws IOException
	{
		Abook person = Abook.findAbook(id);
		String vstr = getVCardString(id);
		response.reset();
		if (request.getHeader("User-Agent").indexOf("MSIE5.0") > -1)
		{
			response.setHeader("content-Type", "dodemo/iirasi;");
		}
		else
		{
			response.setHeader("content-Type", "application/unknown");
		}
		response.setHeader("Content-Disposition",
				"attachment;filename=\"test.vcf\"");
		BufferedInputStream fin = new BufferedInputStream(
				new ByteArrayInputStream(vstr.getBytes()));
		BufferedOutputStream outs = new BufferedOutputStream(
				response.getOutputStream());
		int read = 0;
		byte[] b = new byte[(int) vstr.getBytes().length];
		try
		{
			while ((read = fin.read(b)) != -1)
			{
				outs.write(b, 0, read);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if (outs != null)
				outs.close();
			if (fin != null)
			{
				fin.close();
			}
		}
	}
}