2013-03-20 7 views
2
private void doFileUpload(){ 

    File file1 = new File(selectedPath1); 

    String urlString = "http://example.com/upload_media_test.php"; 
    try 
    { 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost(urlString); 
     FileBody bin1 = new FileBody(file1); 

     MultipartEntity reqEntity = new MultipartEntity(); 
     reqEntity.addPart("uploadedfile1", bin1); 
     reqEntity.addPart("user", new StringBody("User")); 
     post.setEntity(reqEntity); 

     HttpResponse response = client.execute(post); 
     resEntity = response.getEntity(); 
     final String response_str = EntityUtils.toString(resEntity); 

     if (resEntity != null) { 
      Log.i("RESPONSE",response_str); 
      runOnUiThread(new Runnable(){ 
        public void run() { 
         try { 
          res.setTextColor(Color.GREEN); 
          res.setText("n Response from server : n " + response_str); 
          Toast.makeText(getApplicationContext(),"Upload Complete. Check the server uploads directory.", Toast.LENGTH_LONG).show(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
         } 
       }); 
     } 
    } 
    catch (Exception ex){ 
     Log.e("Debug", "error: " + ex.getMessage(), ex); 
    } 
    } 

Получаю этот код из Интернета. это работа, но когда я пытаюсь загрузить файл большего размера, чем 1 Мбайт,Android Изменение размера изображения (resample/downsample) перед загрузкой

Я сталкиваюсь с ошибкой с размером файла.

Я знаю, как изменить размер растровых изображений, но я понятия не имею, что вы загружаете измененное растровое изображение.

Как изменить размер и загрузить файл?

Заранее спасибо

+0

Просто небольшой комментарий: вы можете не захотеть публиковать http-адрес, который принимает данные в вашем вопросе здесь (просто используйте http://example.com/my.php) – pjco

+0

Кроме того, для тех, у кого есть репутация более 1500, Я предлагаю tag 'resample', так как это отличается от размера и поможет Googlers найти это, а не многие вопросы по размеру. – pjco

ответ

2

Вам нужно не только изменить размер растрового изображения, но вы также должны кодировать результат в виде .jpg изображения. Поэтому вы должны открыть файл и преобразовать его в растровое изображение, изменить размер растрового изображения на меньшее изображение, закодировать изображение в массив byte [], а затем загрузить массив byte [] таким же образом, как вы загрузили файл file1.

Если битмап большой, что, по-видимому, у него недостаточно, вам не хватит памяти кучи, чтобы открыть все это, поэтому вам нужно будет открыть его с помощью BitmapFactory.Options.inSampleSize.

Во-первых, открыть уменьшенный размер Bitmap:

Uri uri = getImageUri(selectedPath1); 
BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 4; // Example, there are also ways to calculate an optimal value. 
InputStream in = in = contentResolver.openInputStream(uri); 
Bitmap bitmap = BitmapFactory.decodeStream(in, null, options); 

Далее, кодируют в byte[] массива:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); 
byte[] bitmapdata = bos.toByteArray(); 

Наконец, использовать reqEntity.addPart() добавить byte[] массив непосредственно, или записи на меньший файл и добавьте файл, как в вашем текущем примере.

+0

Спасибо Дэвиду, но у меня также есть trube для загрузки изображения ... :( – Joseph

+0

Проголосовали, но можете ли вы расшифровать 'getImageUri'? Какой объект вызван? Также для многочастных объектов иногда бывает смысл преобразовать массив байтов обратно в локальный файл? – pjco

+2

'getImageUri()' является функцией-заполнителем для преобразования вашей переменной 'selectedPath1' в' Uri'. Я не знаю содержимого 'selectedPath1'. Я считаю, что вы можете преобразуйте прямо так: 'Uri myUri = Uri.parse (selectedPath1);' Да, может быть полезно сохранить массив 'byte []' как файл и загрузить его. Также упрощает использование потока.Но, если изображение достаточно мало, байт-массив также должен работать. –

0

Этот ответ is based on another answer, но у меня были некоторые проблемы с этим кодом, поэтому я отправляю отредактированный и рабочий код.

Я сделал это так:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.outWidth = 50; //pixels 
options.outHeight = 50; //pixels 
InputStream in = context.getContentResolver().openInputStream(data.getData()); // here, you need to get your context. 
Bitmap bitmap = BitmapFactory.decodeStream(in, null, options); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
byte[] bitmapdata = baos.toByteArray(); 

Обратите внимание, что, данные это возвращаемые данные от Intent вы используете, чтобы получить файл. Если у вас уже есть путь к файлу, просто использовать, что ...

И теперь, когда вы создаете HTTP Entity, добавьте:

FormBodyPart fbp = new FormBodyPart("image", new ByteArrayBody(baos.toByteArray(), "image/jpeg", "image")); 
entity.addPart(fbp); 

Кроме того, обратите внимание, что вам нужно MultipartEntity загрузить файлы.

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