3

我正在使用 Jersey,可以上传文件,也可以将虚拟 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));
    }
}
4

1 回答 1

0

如果我正确理解了您的问题,则您的测试代码正在运行:

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

但是当您尝试读取刚刚上传的 InputStream 时,它不起作用。

几条要遵循的曲目:

  1. 您的函数@FormDataParam("file")用于具有不同类型(流和处置)的两个参数。看起来不太对。

  2. 您确定上传的文件不为空吗?

  3. 尝试直接从磁盘读取文件而不上传。它可能会帮助您确定问题是否来自上传。

于 2013-07-04T17:47:05.737 回答