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);
    }
  }

このコードはインターネットから取得します。それはうまくいきますが、1Mバイトを超える大きなファイルをアップロードしようとすると、

ファイルサイズのエラーに直面しています。

ビットマップ画像のサイズを変更する方法は知っていますが、サイズ変更されたビットマップ画像をアップロードする方法がわかりません。

ファイルボディでサイズを変更してアップロードするにはどうすればよいですか?

前もって感謝します

4

2 に答える 2

2

ビットマップのサイズを変更するだけでなく、結果を .jpg イメージとしてエンコードする必要もあります。したがって、ファイルを開いてビットマップに変換し、ビットマップをより小さい画像にサイズ変更し、画像を byte[] 配列にエンコードしてから、ファイルをアップロードしたのと同じ方法で byte[] 配列をアップロードする必要があります。file1.

ビットマップが明らかに大きい場合、全体を開くのに十分なヒープ メモリがないため、 で開く必要がありますBitmapFactory.Options.inSampleSize

まず、縮小サイズのビットマップを開きます。

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[]か、より小さなファイルに書き込み、現在の例のようにファイルを追加します。

于 2013-03-20T21:57:27.313 に答える
0

この回答は別の回答に基づいていますが、そのコードに問題があったため、編集済みの作業コードを投稿します。

私はこのようにしました:

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();

dataは、ファイルを取得するために使用する Intent から返されたデータであることに注意してください。ファイルパスが既にある場合は、それを使用してください...

次に、HTTP エンティティを作成するときに、次を追加します。

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

また、ファイルをアップロードするにはMultipartEntityが必要であることに注意してください。

于 2015-01-12T21:25:46.983 に答える