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

我从互联网上得到这个代码。可以,但是当我尝试上传大于 1Mbyte 的文件时,

我面临文件大小错误。

我知道如何调整位图图像的大小,但我不知道上传调整后的位图图像。

如何调整大小并使用文件体上传?

提前致谢

4

2 回答 2

2

您不仅需要调整位图的大小,还需要将结果编码为 .jpg 图像。因此,您必须打开文件并将其转换为 Bitmap,将 Bitmap 调整为较小的图像,将图像编码为 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[]数组,或写入较小的文件并像当前示例一样添加文件。

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

请注意,数据是您用于获取文件的 Intent 返回的数据。如果您已经有文件路径,请使用它...

现在,当您创建 HTTP 实体时,添加:

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

另外,请注意您需要一个MultipartEntity来上传文件。

于 2015-01-12T21:25:46.983 回答