先日の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(); } } } }