文件上传Google App Engine Blobstore

4

我将使用Google应用引擎Blobstore来存储上传的文件。文件类型可以是任何类型(.txt,.pdf,.docx等)。

我写了以下Servlet来下载存储在Google应用引擎Blobstore中的文件。

public class Serve extends HttpServlet { 

private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();

公共的无返回值方法doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {

    BlobKey blobKey = new BlobKey(req.getParameter("blob-key"));
    blobstoreService.serve(blobKey, res);      

}

每次我通过以下方式提供url请求文件时, http://127.0.0.1:8888/serve?blob-key=DEHQ3U_2wtUdEL7XPI434Q 文件都能够成功下载。但是文件没有扩展名,并且文件名总是“serve”。该怎么做才能下载上传的文件并保留原始文件名呢? 谢谢。
2个回答

4

我使用以下代码将Blob作为字符串传递给我的Serve.java进行服务。文件下载时使用原始文件名以及原始扩展名。在http://onjava.com/onjava/excerpt/jebp_3/index3.html中找到了更详细的讨论。

BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobInfoFactory bi = new BlobInfoFactory();
BlobKey blobKey = new BlobKey(req.getParameter("blob-key"));
String fname = bi.loadBlobInfo(blobKey).getFilename();
res.setContentType("application/x-download");
res.setHeader("Content-Disposition", "attachment; filename=" + fname);
blobstoreService.serve(blobKey, res);

3

我知道Python有一个send_as选项,可以自动设置响应的文件名,但是我认为在Java中,您需要向响应添加Content-Disposition头,例如:

Content-Disposition: attachment; filename=your-file.docx; 

您的 BlobInfo 包含原始文件名,您可以通过 getFilename 获取它。

是的,如果我知道文件名,我可以设置标题。但是有没有一种方法可以使用 blob key 获取存储文件的文件名? - Buddhika.jm
每个Blobstore“blob”都有一个相关的BlobInfo实体,可以使用blob-key获取。 BlobInfo实体存储上传文件的原始文件名,可以通过getFilename访问。 - Chris Farmiloe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接