2013-06-27 3 views
4

Я хочу отправить содержимое файла как org.apache.http.entity.mime.MultipartEntity. Проблема в том, что у меня на самом деле нет файла, но только контент String. Следующий тест отлично работает, где file является java.io.File указывающий на действительный PNG-файл:Отправка виртуального файла как MultipartEntity

MultipartEntity entity = 
    new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
entity.addPart("source", new StringBody("computer")); 
entity.addPart("filename", new FileBody(file, "image/png")); 
HttpPost httpPost = new HttpPost(URL); 
httpPost.setEntity(entity); 
HttpClient httpClient = new DefaultHttpClient(); 

final HttpResponse response = httpClient.execute(httpPost); 
System.out.println(EntityUtils.toString(response.getEntity())); 

Позже, я не буду иметь реальный файл, а только его содержание, как String. Я много не знаю о кодировании (не сказать ничего), но если я пытаюсь тот же подход с временным файлом, который был создан следующим образом

String contents = FileUtils.readFileToString(new File(path),"UTF8"); 
File tmpFile = File.createTempFile("image", "png"); 
tmpFile.deleteOnExit(); 
InputStream in = new ByteArrayInputStream(contents.getBytes("UTF8")); 
FileOutputStream out = new FileOutputStream(tmpFile); 
org.apache.commons.io.IOUtils.copy(in, out); 

The path указывает на точно такой же формат PNG-файл, который преуспел в первом блоке кода, но на этот раз я получаю

Не удалось загрузить изображение; формат не поддерживается

ошибка с сервера. Я подозреваю, что имеет какое-то отношение к кодировке. Кто-нибудь видит, какую очевидную вещь я сделал не так?

+0

, кажется, «содержание» является двоичным файлом, не то, что можно преобразовать в строку – morgano

ответ

6

Не используйте readFileToString, но readFileToByteArray, а не хранить содержимое в строку, но в байте []:

byte[] contents = FileUtils.readFileToByteArray(new File(path)); 
File tmpFile = File.createTempFile("image", "png"); 
tmpFile.deleteOnExit(); 
InputStream in = new ByteArrayInputStream(contents); 
FileOutputStream out = new FileOutputStream(tmpFile); 
org.apache.commons.io.IOUtils.copy(in, out); 
+0

Спасибо. Я бы не стал использовать сам 'String', но интерфейс между * Mathematica * и Java в этом случае немного неясен. В то время как I * может * представлять даже двоичный материал с помощью 'String' в * Mathematica *, он становится испорченным, когда я отправляю его на Java. Во всяком случае, преобразование его в список чисел (байтов) отлично работает. – halirutan

Смежные вопросы