MultipartEntityBuilder 从 Android httpurlconnection 发送数据

2024-03-30

我正在尝试更改 HTTPClient 已弃用的代码,但我在 setEntity 上收到错误,因为它已损坏,而且我不知道如何通过新的 httpConnectionUrl 来 paas MultipartEntityBuilder。我旧的已弃用的代码片段

    try {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(imagePostUrl);

        for (String fileName : fileNameArrayList) {

            File file = new File(fileName);
            // 1st

            int quality = GeneralUtil.getQualityOfImage(file);

            ByteArrayOutputStream bos = new ByteArrayOutputStream();

            if (quality <= 25) { // This means image file size is in MB's so we need to avoide out of memory issues.

                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = false;
                options.inPreferredConfig = Bitmap.Config.RGB_565;
                options.inDither = true;
                try {
                    bitmap = BitmapFactory.decodeFile(file.getPath(), options);
                } catch (OutOfMemoryError E) {
                    System.gc();
                    bitmap = GeneralUtil.decodeFile(file);

                }

                bitmap.compress(CompressFormat.JPEG, quality, bos);
                bitmap.recycle();
                bitmap = null;

            } else {

                try {
                    bitmap = BitmapFactory.decodeFile(file.getPath());
                    bitmap.compress(CompressFormat.JPEG, quality, bos);
                    bitmap.recycle();
                    bitmap = null;
                } catch (OutOfMemoryError E) {
                    System.gc();

                    try {
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inJustDecodeBounds = false;
                        options.inPreferredConfig = Bitmap.Config.RGB_565;
                        options.inDither = true;

                        bitmap = BitmapFactory.decodeFile(file.getPath(), options);
                        bitmap.compress(CompressFormat.JPEG, quality, bos);
                        bitmap.recycle();
                        bitmap = null;
                    } catch (OutOfMemoryError ex) {

                        bitmap = GeneralUtil.decodeFile(file);
                        bitmap.compress(CompressFormat.JPEG, quality, bos);
                        bitmap.recycle();
                        bitmap = null;
                        throw new Exception();
                    }
                }
            }

            byte[] data = bos.toByteArray();
            String timeStamp = GeneralUtil.generateTimeStamp();
            ByteArrayBody bin = new ByteArrayBody(data, myMobileNo + "_" + userName + "_" + timeStamp + ".jpg");

            MultipartEntityBuilder multiPartEntityBuilder = MultipartEntityBuilder.create();
            multiPartEntityBuilder.addPart("uploadedfile1", bin);
            multiPartEntityBuilder.addPart("inviteId", new StringBody(inviteIdArrayList.get(0).toString(), Charset.forName("UTF-8")));
            post.setEntity(multiPartEntityBuilder.build());
            HttpResponse httpResponse = null;
            httpResponse = client.execute(post);
            InputStream inputStream = null;
            inputStream = httpResponse.getEntity().getContent();
            if (inputStream != null)
                result.add(convertInputStreamToString(inputStream));
            else
                result.add("Did not work!");
        }

我的新的不起作用的代码片段

    try {
        HttpURLConnection httpcon = (HttpURLConnection) ((new URL(imagePostUrl).openConnection()));
        httpcon.setDoOutput(true);
        for (String fileName : fileNameArrayList) {
            File file = new File(fileName);
            int quality = GeneralUtil.getQualityOfImage(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            if (quality <= 25) { 
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = false;
                options.inPreferredConfig = Bitmap.Config.RGB_565;
                options.inDither = true;
                try {
                    bitmap = BitmapFactory.decodeFile(file.getPath(), options);
                } catch (OutOfMemoryError E) {
                    System.gc();
                    bitmap = GeneralUtil.decodeFile(file);

                }
                bitmap.compress(CompressFormat.JPEG, quality, bos);
                bitmap.recycle();
                bitmap = null;

            } else {

                try {
                    bitmap = BitmapFactory.decodeFile(file.getPath());
                    bitmap.compress(CompressFormat.JPEG, quality, bos);
                    bitmap.recycle();
                    bitmap = null;
                } catch (OutOfMemoryError E) {
                    System.gc();

                    try {
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inJustDecodeBounds = false;
                        options.inPreferredConfig = Bitmap.Config.RGB_565;
                        options.inDither = true;

                        bitmap = BitmapFactory.decodeFile(file.getPath(), options);
                        bitmap.compress(CompressFormat.JPEG, quality, bos);
                        bitmap.recycle();
                        bitmap = null;
                    } catch (OutOfMemoryError ex) {

                        bitmap = GeneralUtil.decodeFile(file);
                        bitmap.compress(CompressFormat.JPEG, quality, bos);
                        bitmap.recycle();
                        bitmap = null;
                        throw new Exception();
                    }


                }
            }
            byte[] data = bos.toByteArray();
            String timeStamp = GeneralUtil.generateTimeStamp();
            ByteArrayBody bin = new ByteArrayBody(data, myMobileNo + "_" + userName + "_" + timeStamp + ".jpg");
            MultipartEntityBuilder multiPartEntityBuilder = MultipartEntityBuilder.create();
            multiPartEntityBuilder.addPart("uploadedfile1", bin);
            multiPartEntityBuilder.addPart("inviteId", new StringBody(inviteIdArrayList.get(0).toString(), Charset.forName("UTF-8")));
            httpcon.setEntity(multiPartEntityBuilder.build()); **error**
            // Execute POST request to the given URL
           // HttpResponse httpResponse = null;
          //  httpResponse = client.execute(post);
            httpcon.setRequestMethod("POST");
            httpcon.connect();

这是我建议的替代解决方案:

首先,你可以参考以下一些库:Volley https://developer.android.com/training/volley/index.html, Retrofit http://square.github.io/retrofit/...

如果您想使用Volley,您可以参考以下一些链接:

  • 使用 Volley 且不使用 HttpEntity 处理 POST 多部分请求 https://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity
  • 如何使用 Volley 在 Android 中发送“multipart/form-data”POST https://stackoverflow.com/questions/16797468/how-to-send-a-multipart-form-data-post-in-android-with-volley/

我与上面第一个链接相关的示例代码

MultipartActivity.java:

public class MultipartActivity extends Activity {

    private final Context context = this;
    private final String twoHyphens = "--";
    private final String lineEnd = "\r\n";
    private final String boundary = "apiclient-" + System.currentTimeMillis();
    private final String mimeType = "multipart/form-data;boundary=" + boundary;
    private byte[] multipartBody;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_multipart);

        byte[] fileData1 = getFileDataFromDrawable(context, R.drawable.ic_action_android);
        byte[] fileData2 = getFileDataFromDrawable(context, R.drawable.ic_action_book);

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bos);
        try {
            // the first file
            buildPart(dos, fileData1, "ic_action_android.png");
            // the second file
            buildPart(dos, fileData2, "ic_action_book.png");
            // send multipart form data necesssary after file data
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
            // pass to multipart body
            multipartBody = bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String url = "http://192.168.1.100/api/postfile";
        MultipartRequest multipartRequest = new MultipartRequest(url, null, mimeType, multipartBody, new Response.Listener<NetworkResponse>() {
            @Override
            public void onResponse(NetworkResponse response) {
                Toast.makeText(context, "Upload successfully!", Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(context, "Upload failed!\r\n" + error.toString(), Toast.LENGTH_SHORT).show();
            }
        });

        VolleySingleton.getInstance(context).addToRequestQueue(multipartRequest);
    }

    ...

    private void buildPart(DataOutputStream dataOutputStream, byte[] fileData, String fileName) throws IOException {
        dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
        dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\"; filename=\""
                + fileName + "\"" + lineEnd);
        dataOutputStream.writeBytes(lineEnd);

        ByteArrayInputStream fileInputStream = new ByteArrayInputStream(fileData);
        int bytesAvailable = fileInputStream.available();

        int maxBufferSize = 1024 * 1024;
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);
        byte[] buffer = new byte[bufferSize];

        // read file and write it into form...
        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        while (bytesRead > 0) {
            dataOutputStream.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        }

        dataOutputStream.writeBytes(lineEnd);
    }

    private byte[] getFileDataFromDrawable(Context context, int id) {
        Drawable drawable = ContextCompat.getDrawable(context, id);
        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteArrayOutputStream);
        return byteArrayOutputStream.toByteArray();
    }
}

多部分请求.java:

class MultipartRequest extends Request<NetworkResponse> {
    private final Response.Listener<NetworkResponse> mListener;
    private final Response.ErrorListener mErrorListener;
    private final Map<String, String> mHeaders;
    private final String mMimeType;
    private final byte[] mMultipartBody;

    public MultipartRequest(String url, Map<String, String> headers, String mimeType, byte[] multipartBody, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.mListener = listener;
        this.mErrorListener = errorListener;
        this.mHeaders = headers;
        this.mMimeType = mimeType;
        this.mMultipartBody = multipartBody;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return (mHeaders != null) ? mHeaders : super.getHeaders();
    }

    @Override
    public String getBodyContentType() {
        return mMimeType;
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        return mMultipartBody;
    }

    @Override
    protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
        try {
            return Response.success(
                    response,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            return Response.error(new ParseError(e));
        }
    }

    @Override
    protected void deliverResponse(NetworkResponse response) {
        mListener.onResponse(response);
    }

    @Override
    public void deliverError(VolleyError error) {
        mErrorListener.onErrorResponse(error);
    }
}

当然,您可以在 SO 中找到更多可用内容。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MultipartEntityBuilder 从 Android httpurlconnection 发送数据 的相关文章

  • 关闭 Android 中的飞行模式

    如果 num gt 50 我想关闭飞行模式 我实现了这段代码 来自在 Android 中切换飞行模式 https stackoverflow com questions 5533881 toggle airplane mode in and
  • 定期运行任务(每天一次/每周一次)

    我想定期 每周 每天一次 运行一些任务 即获取我的网站新闻页面 即使我的应用程序已关闭 是否可以 是的 您需要查看报警管理器 http developer android com reference android app AlarmMan
  • AppCompat v21 工具栏更改徽标大小

    我正在从以前的操作栏迁移到 appcompat v21 中的新工具栏功能 我仍然想将徽标保留在操作栏 工具栏 的左上角 为此 我在布局中添加了支持工具栏 并为其创建了一个新的工具栏 app theme style NewToolBarSty
  • Android Studio:lambda 不起作用[重复]

    这个问题在这里已经有答案了 当尝试使用 lambda 表达式时 我遇到了一些 Gradle 构建错误 错误 41 100 错误 source 1 7 不支持 lambda 表达式 使用 source 8 或更高版本来启用 lambda 表达
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • 按钮未显示在屏幕上

    我创建了一个应用程序 其中显示带有图像和文本的列表视图 我在页面末尾添加按钮 但这没有显示在屏幕上 我是 Android 新手 我该如何解决这个问题 这是我的 UI XML 代码
  • 访问角落里的存储

    我能找到的与文件存储有关的最接近文档的是这个帖子 http nookdeveloper zendesk com entries 20257971 updated what are the size constraints on my app
  • 如何在 Android 上创建 YouTube 的双击手势?

    我在 Android 上有 exoplayer 的应用程序 我已经创建了 youtube双击手势用动画向前或向后跳跃 10 秒 如何在双击时创建具有波纹效果的半圆 像这样 这个怎么做 我也想实现这样的功能 所以我自己编写了它来 复制 You
  • 使用 Android 播放任意音调

    有没有办法让Android发出任意频率的声音 意思是 我不想预先录制声音文件 我环顾四周 音调发生器 http developer android com reference android media ToneGenerator html
  • android 确定设备是否采用从右到左的语言/布局

    有没有办法确定设备是否使用从右到左的语言 例如阿拉伯语 而不是从左到右的语言 英语 与较旧的 API 级别 低至 10 兼容的东西是必要的 SOLUTION 我最终在接受的答案中使用了 xml 方法 接下来 我还添加了此处指示的代码 以应对
  • 获取可以共享数据的应用程序列表

    此代码显示默认共享对话框 Intent sharingIntent new Intent Intent ACTION SEND sharingIntent setType text html sharingIntent putExtra a
  • AnalyticsService 未在应用程序清单中注册 - 错误

    我正在尝试使用 sdk 中提供的以下文档向 Android 应用程序实施谷歌分析服务 https developers google com analytics devguides collection android v4 https d
  • window.onbeforeunload 在 Android Chrome 上不会触发 [alt.解决方案?]

    我开发了一个简单的聊天应用程序 我正在使用 window onbeforeunload当有人关闭选项卡 浏览器时 基本上是当用户离开房间时 通知其他用户 这是我的代码 scope onExit function scope chatstat
  • 如何在Android Compose中使用otf类型字体文件?

    我正在学习使用 Android Jetpack Compose 现在我有一个正则 otf字体文件在资产 字体 我想在文本中使用它 java lang RuntimeException Font asset not found commonu
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • Android 中的 Google Places API - 适用于个人用户的 API_KEY

    我已经浏览了与在 Android 应用程序中使用 Places API 相关的 Android 文档和其他博客 到处都建议使用 API KEY 来调用 REST 服务 API KEY 在整个项目 应用程序中都是相同的 每天的请求数限制为 1
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • Flutter http请求上传mp3文件

    我使用这个 api 上传 mp3 文件 使用这种方法 Future
  • 如何以编程方式创建活动转换?

    我想以编程方式创建一个动画 以从触摸屏点启动具有缩放效果的活动 接下来我模拟缩放输入效果

随机推荐

  • 错误:GDK_BACKEND 与可用显示器不匹配;使用 Crontab 运行 Selenium

    我正在尝试使用 cron 运行 selenium import os from selenium import webdriver from selenium webdriver firefox options import Options
  • 发送 HTML 电子邮件 asp

    我想在电子邮件中添加一些 html 我已经尝试过以下方法 vFromName someone vFromAddress someemail vTo recipient vSubject someSubject vBodyofemail ta
  • Client = Discord.client() TypeError: 'module' 对象不可调用

    为什么我会得到TypeError module object is not callable用我的代码 import discord from discord ext commands import Bot from discord ext
  • Google Cloud Endpoints:verifyToken:签名长度不正确

    今天早上 从我的 Android 应用程序向我的 Google Cloud Endpoint 发出的每个 API 请求都开始出现以下异常 com google api server spi auth GoogleIdTokenUtils v
  • 测量任务之间的响应时间

    我正在编写一个程序 用Python 它返回一些数据 我想知道如何测量请求和答案之间的响应时间 用于性能分析 然后我会将其存储在某个地方 有一种更好更有效的方法来做到这一点 或者只是插入例如time ctime 在请求和另一个请求之前time
  • 使用 TPL 时如何管理线程本地存储 (TLS)?

    我想将日志记录上下文信息存储在 TLS 中 以便可以在入口点设置一个值 并使该值在所有结果堆栈中可用 这工作得很好 但我还使用了 TPL 和 ThreadPool 那么问题就变成了如何将 TLS 数据迁移到其他线程 我可以自己完成这一切 但
  • 如何为具有大图像目录的博客设置 Jekyll,以避免在生成的站点中重复该目录?

    我正在考虑使用 Jekyll 构建一个网站 该网站将成为一个包含大量图像 以及其他大型媒体文件 的博客 创建图像目录 然后根据帖子中的需要链接到它们是很容易的 但是 据我了解 生成站点时 所有图像数据将被复制到保存静态文件的生成的 site
  • 如何在 IntelliJ IDEA 中搜索特定代码块?

    我如何搜索withinIntelliJ IDEA 中的特定代码块或选择 I got used to using this feature in Eclipse In Eclipse you can just double click on
  • 为什么 ViewModelProvider 在屏幕旋转时创建视图模型的新实例?

    我试图实现分页 但每次旋转视图模型的屏幕构造函数都会被调用 从而触发 loadInitial 从我的 DataSource 类中的网络获取新数据 感谢帮助 ViewModel def lifecycle version 2 2 0 impl
  • 有关新 Windows 10 错误的信息:ERROR_CLOUD_FILE_ACCESS_DENIED

    打开文件进行读取时遇到新的 Windows 10 错误代码CreateFile 我们得到错误395 但关于其含义或如何解决的信息很少 Windows 10 SDK的错误详细信息如下 错误编号395 误差常数ERROR CLOUD FILE
  • 获取中位数对应的索引

    我有一个带有一列的 pandas 数据框 我想知道中位数的索引 也就是说 我这样确定中位数 df 中位数 这给了我中值 但我想知道该行的索引 这个可以确定吗 对于长度不均匀的列表 我可以搜索具有该值的索引 但对于均匀的列表长度 这是行不通的
  • JSR303 自定义验证器被调用两次

    我正在使用 Spring MVC 创建一个网站 为了持久性 我使用 Spring Data JPA 和 Hibernate 4 作为我的 JPA 提供程序 目前正在使用 Hibernate Validator 处理验证 我遇到一个问题 我的
  • Javascript 嵌套函数失去作用域

    有人可以解释一下以下代码的范围绑定吗 window name window object name object method function nestedMethod function console log this name nes
  • 无法在 GitHub 上呈现标头

    这是我的README md在 GitHub 存储库中 This is a Header This is not a Header 这两行都呈现为纯文本 第一个应该呈现为标题 我记得它之前是这样的 我不知道我的浏览器 macOS 上的 Chr
  • 用 Java 实现最佳匹配搜索

    我正在尝试使用现有的 Java 数据结构获得最佳匹配字符串匹配 虽然速度很慢 但任何提高其性能的建议都将受到欢迎 样本数据看起来像这样 Key V 0060175559138 VIP 006017555 National 006017 Lo
  • 模板引用变量在 ng-template 内返回未定义

    已经尝试过this https stackoverflow com questions 45677905 angular4 component reference inside ng template and this https stac
  • 如何在 Windows 8 中以编程方式检查/切换飞行模式?

    我必须检查 Windows 8 中是否启用了飞行模式 并且可能需要切换其状态 我目前正在开发 C NET 4 0 Windows 窗体应用程序 但此问题的答案不应受此限制 不幸的是 Metro 应用程序没有一种编程方式来更改 Windows
  • 使用 API 创建 Amazon EC2 实例

    com amazonaws services ec2 是否包含从现有 AMI 创建全新 EC2 实例的方法 我希望通过 Java SDK 而不是 Web 管理控制台来执行此操作 以下是使用 Amazon AWS SDK for Java 创
  • Spring STS 不适用于 Gradle

    我已经下载了Spring STS 我创建了一个项目 新的 spring 启动项目 并选择了 gradle buildship 它说我没有 需要从市场上购买 我去了市场 得到了它 重新启动 创建了一个示例 gradle java 项目并编译它
  • MultipartEntityBuilder 从 Android httpurlconnection 发送数据

    我正在尝试更改 HTTPClient 已弃用的代码 但我在 setEntity 上收到错误 因为它已损坏 而且我不知道如何通过新的 httpConnectionUrl 来 paas MultipartEntityBuilder 我旧的已弃用