I am using Jersey and I can upload a file, I can also write dummy blobs to the datastore. but I am stuck at writing the file that I uploaded to the datastore.
@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));
}
}
If I understand your question correctly, you test code is working:
// This time we write to the channel directly
writeChannel.write(ByteBuffer.wrap, "And miles to go before I sleep.".getBytes());
But it is not working when you try to reading you InputStream you just uploaded.
Few tracks to follow:
Your function use @FormDataParam("file")
for two parameters with different type (stream and disposition) . Doesn't look right.
Are you sure the uploaded file is not null?
Try to read the file directly form the disk without uploading. It might help you figuring out if the problem come from the upload or not.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.