2013-07-04 32 views
2

我使用的是Jersey,我可以上传文件,也可以将虚拟blob写入数据存储区。但我坚持写入我上传到数据存储的文件。如何从InputStream存储Blob

@Path("/blob/") 
public class UploadFileService { 

    @POST 
    @Path("/upload/") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    public Response uploadFile(@FormDataParam("file") InputStream stream, @FormDataParam("file") FormDataContentDisposition disposition) throws IOException { 

     storeBlob(); 

     return Response.ok().build(); 
    } 

    public void storeBlob() throws IOException{ 


     // Get a file service 
      FileService fileService = FileServiceFactory.getFileService(); 

      // Create a new Blob file with mime-type "text/plain" 
      AppEngineFile file = fileService.createNewBlobFile("text/plain"); 

      // Open a channel to write to it 
      boolean lock = false; 
      FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock); 

      // Different standard Java ways of writing to the channel 
      // are possible. Here we use a PrintWriter: 
      PrintWriter out = new PrintWriter(Channels.newWriter(writeChannel, "UTF8")); 
      out.println("The woods are lovely dark and deep."); 
      out.println("But I have promises to keep."); 

      // Close without finalizing and save the file path for writing later 
      out.close(); 
      String path = file.getFullPath(); 

      // Write more to the file in a separate request: 
      file = new AppEngineFile(path); 

      // This time lock because we intend to finalize 
      lock = true; 
      writeChannel = fileService.openWriteChannel(file, lock); 

      // This time we write to the channel directly 
      writeChannel.write(ByteBuffer.wrap 
        ("And miles to go before I sleep.".getBytes())); 

      // Now finalize 
      writeChannel.closeFinally(); 

      // Later, read from the file using the Files API 
      lock = false; // Let other people read at the same time 
      FileReadChannel readChannel = fileService.openReadChannel(file, false); 

      // Again, different standard Java ways of reading from the channel. 
      BufferedReader reader = 
        new BufferedReader(Channels.newReader(readChannel, "UTF8")); 
       String line = reader.readLine(); 
      // line = "The woods are lovely dark and deep." 

      readChannel.close(); 

      // Now read from the file using the Blobstore API 
      BlobKey blobKey = fileService.getBlobKey(file); 
      BlobstoreService blobStoreService = BlobstoreServiceFactory.getBlobstoreService(); 
      String segment = new String(blobStoreService.fetchData(blobKey, 30, 40)); 
    } 
} 
+0

请您详细说明在您编写的代码中不起作用的内容吗? –

回答

0

如果我正确理解你的问题,你测试代码工作:

// This time we write to the channel directly 
writeChannel.write(ByteBuffer.wrap, "And miles to go before I sleep.".getBytes()); 

但是当你试图读你的InputStream你只是上传它不工作。


几个轨道遵循:
1)你的函数使用@FormDataParam(“文件”)两个参数有不同的类型(流和处置)。看起来不正确。

2)你确定上传的文件是否为空?

3)尝试直接从磁盘读取文件,无需上传。它可以帮助您确定问题是否来自上传。