2012-03-01 297 views
0

我已经上传至文件系统使用API​​来Blob存储的图像。这些文件已经成功上传,我可以在相应的目录中看到这些斑点。解码与文件系统API创建的文件

但后来,我该如何解码这些文件,发送回来的时候给客户端或使用Blob存储区API检索到的,我能够得到的图像?眼下/ Blob存储/写:XXX是不是对我很有用,因为当我在包装的<img src="/blobstore/writable:xxx" />路径,它并没有给我一个图像。

回答

0

我把它固定的:

FileService fileService = FileServiceFactory.getFileService(); 
    AppEngineFile writableFile = fileService.createNewBlobFile(request.getParameter("qqfile")); 
    FileWriteChannel writeChannel = null; 
     try { 
       byte[] buffer = new byte[4096]; // 4MB 
       lock = true; 
       writeChannel = fileService.openWriteChannel(writableFile, lock); 
       // increase the buffer size as you are reading from the 
       // input stream. Read the input stream into buffer 
       for (int n; (n = stream.read(buffer)) != -1;){ 
        writeChannel.write(ByteBuffer.wrap(buffer)); 
       } 
      } finally { 
        writeChannel.closeFinally(); 
      } 

    BlobKey blobKey = fileService.getBlobKey(writableFile); 
    ImagesService imagesService = ImagesServiceFactory.getImagesService(); 

    // produces something like http://localhost:8888/_ah/img/SU52WMsoCRP3kqAvQqVW3g 
    String imageUrl = imagesService.getServingUrl(blobKey); 
1

几个选项 -

  1. 使用getServingUrl创建一个URL到你的图像,然后返回网址作为响应的一部分。将该URL存储在数据存储中,因为该URL不会更改为同一个blob。这也可以让你动态调整大小和裁剪你正在服务的图像。这些URL是公开的,所以如果您想要某种形式的访问控制来提供您可能需要的图像选项(2)。

  2. 使用serveBlob和请求处理程序来发送图像。没有动态调整大小(如果需要,可以在处理程序中自行完成),但如果需要,可以ACL对每个请求进行ACL。

+1

月1日,我不打算将图像存储在Blob存储区。相反,我正在使用文件系统API。但我是一个例外,而这样做:'java.lang.IllegalArgumentException异常:无法读取image'。你知道我可能做错什么吗? – drecute 2012-03-02 15:20:44

+0

FYI文件系统API存储BLOB的任一的Blobstore或谷歌存储。您需要从存储的对象中生成一个blobkey。 – 2012-03-02 22:22:50