当前位置: 首页 > 知识库问答 >
问题:

使用MultipartEntityBuilder和HttpURLConnection发送图像

史默
2023-03-14

我正在尝试使用MultipartEntityBuilder和HttpURLConnection向服务器发送一个映像,然后接收一个字符串答案(现在它使用http协议,但我将使用此代码或非常类似的代码使用https来完成)。但当我按下按钮发送时,应用程序崩溃了,而logcat没有告诉我任何关于捕获的信息。下一个代码来自我执行此操作的类:

public class EnvioImagenes extends AsyncTask<String, Void, String>
{
    public String direccion="";
    public EnvioImagenes(String cuerpo){
        direccion=cuerpo;
    }


    protected String doInBackground(String... url){
        Bitmap bitmap = null;
        ByteArrayOutputStream bos=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
        ContentBody contentPart = new ByteArrayBody(bos.toByteArray(), direccion);
        MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
        multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        multipartEntity.addPart("Picture",contentPart);

        try {
            HttpURLConnection connection = (HttpURLConnection) new URL(url[0]).openConnection();
            connection.setReadTimeout(10000);
            connection.setConnectTimeout(15000);
            connection.setRequestMethod("POST");
            connection.setUseCaches(false);
            //Si quiero enviar/recibir una respuesta en el cuerpo del mensaje, tiene que estar lo siguiente:
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setRequestProperty("Connection", "Keep-Alive");
            String boundary= "--------------"+System.currentTimeMillis();
            multipartEntity.setBoundary(boundary);
            connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            DataOutputStream dos=new DataOutputStream(connection.getOutputStream());
            //connection.addRequestProperty(multipartEntity.getClass().getName(), multipartEntity.getClass().toString());
            //OutputStream output=new BufferedOutputStream(connection.getOutputStream());
            dos.writeBytes("\r\n");
            dos.flush();
            dos.close();
            //output.write(body.getBytes());
            //output.flush();

            int responseCode = connection.getResponseCode();
            InputStream inputStream = connection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String line;
            StringBuilder result = new StringBuilder();

            while ((line = bufferedReader.readLine()) != null) {
                result.append(line);
            }

            String responseString = result.toString();
            inputStream.close();
            connection.disconnect();
            return responseString;

        } catch(Exception exc) {
            String error = exc.toString();
            Log.e("This is the mistake.....", exc.getMessage());
            return error;
        }
    }
}
Warning:WARNING: Dependency org.apache.httpcomponents:httpclient:4.5.3 is ignored for release as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages.

我试图解决这个问题:从浏览器下载包,然后将其粘贴到库中的文件夹/lib中,然后从build.gradle中更改代码,使程序从那里检查库,但后来我出现了一个错误,即没有检测到我使用MultipartEntityBuilder的代码中的库;所以我认为问题出在代码本身上:特别是因为我没有使用HttpClient。对于任何问题,build.gradle的代码实际上是这样的:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "com.example.franco.pruebalogin"
        minSdkVersion 10
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.android.support:design:24.0.0'
    compile 'org.apache.httpcomponents:httpmime:4.5.3'
}

共有1个答案

罗毅
2023-03-14

我沿着这条路走下去,但最终改用了SynchTtpClient。

private static final String COMPRESSED_FILE_PREFIX = "yourapp_image_compressed_";
private static final String JPEG_FILE_EXTENSION = ".jpeg";
private static final int FIVE_MINUTE_INIT_TIMEOUT = 300000;

public void uploadImage(Context applicationContext, ArrayList<String> filePathsToUpload) {
        RequestParams requestParams = new RequestParams();

        File imagesCacheDir;

        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED)) {
            imagesCacheDir = new File(
                    android.os.Environment.getExternalStorageDirectory(),
                    "/Android/data/com.example.yourapp/UploadPics");
        } else {
            imagesCacheDir = applicationContext.getCacheDir();
        }

        if (!imagesCacheDir.exists()) {
            if (!imagesCacheDir.mkdirs()) {
                throw new RuntimeException("Image directory could not be created.");
            }
        }

        for (String filePath : filePathsToUpload) {
            File file;

            try {
                FileOutputStream out = new FileOutputStream(new File(imagesCacheDir,
                        COMPRESSED_FILE_PREFIX + filePathsToUpload.size() + 1 + JPEG_FILE_EXTENSION));

                BitmapFactory.decodeFile(filePath).compress(Bitmap.CompressFormat.JPEG, compress ? 90 : 100, out);

                file = new File(imagesCacheDir, COMPRESSED_FILE_PREFIX + filePathsToUpload.size() + 1 + JPEG_FILE_EXTENSION);
                requestParams.put(file.getName(), file);
                out.close();
            } catch (FileNotFoundException fnfe) {
                throw new RuntimeException("Image file not found.");
            } catch (IOException ie) {
                throw new RuntimeException("Error writing image to file.);
            }
        }

        SyncHttpClient client = new SyncHttpClient();
        client.setTimeout(FIVE_MINUTE_INIT_TIMEOUT);

        Map<String, String> headers = VolleyUtils.getBigOvenHeaders();
        headers.putAll(VolleyUtils.getAuthenticationHeader());

        for (String headerKey : headers.keySet()) {
            client.addHeader(headerKey, headers.get(headerKey));
        }

        MySSLSocketFactory socketFactory;

        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null, null);
            socketFactory = new MySSLSocketFactory(trustStore);
            socketFactory.setHostnameVerifier(MySSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            client.setSSLSocketFactory(socketFactory);
        } catch (Exception e) {
            // Probably should die or something, unless http is okay (if you need https, this is no go)
        }

        client.setTimeout(FIVE_MINUTE_INIT_TIMEOUT);

        client.post(this, "https://www.myapp.com/imageUploader", requestParams, new RotatingBitmapTextHttpResponseHandler(filePathsToUpload, notificationBuilder, onCompletionText));
}

您可以将HttpResponseHandler更改为您想要的任何内容。在本例中,我创建了一个跟踪进度并在通知中显示的类。你可以在那里做任何你想做的事。

 类似资料:
  • 由于Android开发人员建议使用类,我想知道是否有人能为我提供一个很好的例子,说明如何通过POST将位图“文件”(实际上是内存流)发送到Apache HTTP服务器。我对cookie、身份验证或任何复杂的东西都不感兴趣,但我只想有一个可靠的逻辑实现。我在这里看到的所有例子看起来更像是“让我们试试这个,也许它会奏效”。 现在,我有以下代码: 其中showDialog应该只显示一个(如果URL无效?

  • 我试图使用身份验证值发送响应到服务器,它在登录时提供给我。服务器仅在发送该值时接受请求。然而,它可以很好地与邮递员(见快照),但不与我的代码。 密码 我也试过这样做

  • 我正在尝试将发送到我的 Rails 服务器。但是,当我尝试构建它时,它会崩溃并给我错误 03-25 09:44:50.001 W/system . err£Java . util . concurrent . execution exception:Java . lang . nosuchmethod error:没有静态方法create(Ljava/lang/String;[Lorg/Apach

  • 问题内容: 我尝试将数据上传到服务器,我的数据包含多张图片和大图片,在此之前,我尝试使用将图片转换为字符串,并使用之前发送过的其他数据和图片,但是我在这里遇到问题,因此,我阅读了其中一种必须尝试使用​​的解决方案。我仍然感到困惑,不知道如何使用它,有没有人可以帮助我使用该方法呢?这是我的代码: 有没有人可以帮助我教导和告诉我如何使用MultiPartEntityBuilder发送JSON和图像?

  • 我必须向服务器发送一个映像(我认为最好的选择是使用HttpURLConnection)并从它接收一个字符串答案。在我读过的不同的文档和web站点中,我研究了这样做的最佳方法是使用多伙伴关系。 1_做它是最好的解决方案吗? 2_我有一个错误,说Android Studio无法解析符号'multipartentity'。我读到,要解决它,我必须下载外部库。哪些是它们,我如何下载它们? 3_为此,我想在

  • 我有一个网络服务,我想用“应用/x-www-表单-urlencoded”内容类型调用它。请求有时包含特殊字符,如*-和......问题是目标Web服务不能完美地接收请求。它接收类似这样的: "////////////////w=="几乎所有字符都转到/。到底是什么问题? 这是我的密码: web服务接收: