2013-02-19 2 views
1

Как преобразовать AppEngineFile в массив байтов?AppEngineFile to byte []

У меня есть файл, созданный из BlobKey как этот

AppEngineFile file = fileService.getBlobFile(new BlobKey("blob key")); 

Я уже пытался что-то вроде этого

FileService fileService = FileServiceFactory.getFileService(); 

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

BlobstoreInputStream b = new BlobstoreInputStream(new BlobKey(video.getBlobkey())); 

RandomAccessFile f = new RandomAccessFile(file.getFullPath(), "r"); 
byte[] pixels = b.read(); //doesn't work 

Идея заключается в том, чтобы отправить этот массив байтов с запросом POST.

Вот мой код, я должен построить запрос:

String attachmentName = "test"; 
String attachmentFileName = "test.mp4"; 
String crlf = "\r\n"; 
String twoHyphens = "--"; 
String boundary = "*****"; 

HttpURLConnection httpUrlConnection = null; 
URL url = new URL("http://example.com/server.cgi"); 
httpUrlConnection = (HttpURLConnection) url.openConnection(); 
httpUrlConnection.setUseCaches(false); 
httpUrlConnection.setDoOutput(true); 
DataOutputStream request = new DataOutputStream(httpUrlConnection.getOutputStream()); 

request.writeBytes(twoHyphens + boundary + crlf); 
request.writeBytes("Content-Disposition: form-data; name=\"" + attachmentName + "\";filename=\"" + attachmentFileName + "\"" + crlf); 
request.writeBytes(crlf); 

// Get a file service 
FileService fileService = FileServiceFactory.getFileService(); 
// Create a new Blob file with mime-type "text/plain" 
AppEngineFile file = fileService.getBlobFile(new BlobKey(video.getBlobkey())); 

BlobstoreInputStream b = new BlobstoreInputStream(new BlobKey(video.getBlobkey())); 

RandomAccessFile f = new RandomAccessFile(file.getFullPath(), "r"); 
byte[] pixels = b.read(); 

request.write(pixels); 

request.writeBytes(crlf); 
request.writeBytes(twoHyphens + boundary + twoHyphens + crlf); 

request.flush(); 
request.close(); 

InputStream responseStream = new BufferedInputStream(httpUrlConnection.getInputStream()); 

BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream)); 
String line = ""; 
StringBuilder stringBuilder = new StringBuilder(); 
while ((line = responseStreamReader.readLine()) != null) 
{ 
    stringBuilder.append(line).append("\n"); 
} 
responseStreamReader.close(); 

String response = stringBuilder.toString(); 
System.out.println(response); 

ответ

2
AppEngineFile file = ... 

int size = (int) fileservice.stat(file).getLength().longValue(); 

    FileReadChannel ch = fileservice.openReadChannel(file, true); 
    ByteBuffer dst = ByteBuffer.allocate(size); 
    try { 
     int sum=0; 
     while (sum<size) { 
      int read = ch.read(dst); 
      sum+=read; 
     } 
    } finally {ch.close();} 

    bytes byte[] = dst.array(); 

(Это не способ чтения из канала в Java, но мне кажется, есть в AppEngine bug, что требует вы знаете точное количество байтов).

+0

является соответственно HttpServletResponse? –

+0

Установите код состояния в 200 (OK) ... Это код состояния по умолчанию, поэтому он должен быть таким же, если вы удалите эту строку. – Javier

+0

Да, это он HTTPServletResponse – Javier

3

Вы можете просто сделать это:

FileReadChannel ch = fileservice.openReadChannel(file, true); 
byte[] data = getBytes(Channels.newInputStream(ch)); 

и использовать этот удобный метод (годный к употреблению в другом месте):

public static byte[] getBytes(InputStream is) throws IOException { 
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

    int len; 
    byte[] data = new byte[100000]; // adapt buffer size to your needs 
    while ((len = is.read(data, 0, data.length)) != -1) { 
     buffer.write(data, 0, len); 
    } 

    buffer.flush(); 
    return buffer.toByteArray(); 
} 
+0

Я попробовал [this] (http://code.google.com/p/googleappengine/issues/attachmentText?id=7862&aid=78620002000&name=fragment&token=ZhHB7_ZD-eR18jvUurfhpNCNnCI%3A1361371852297), и он заблокирован. – Javier

+0

is.read (data, 0, data.length) -1:/ –

+0

@JeromeAnsia Когда 'is.read (data, 0, data.length) == -1' вы достигли конца потока. В чем проблема? –