如何在 Android 中恢复文件上传过程?

2024-01-07

我正在使用此代码在服务器上上传文件,但我想要这样的功能:如果在过程中由于网络丢失或任何其他中断而停止,那么它不应该从第二次开始上传。来自服务器的响应也是可定制的。在安卓上可以吗?我应该使用什么方法来做到这一点?请指导我。 如果可能的话,请向我推荐任何示例代码。

Thanks!

public String uploadFile(InputStream is) {
    HttpURLConnection conn;
    String jsonResponse = "";
    int streamSize = 0;
    DataOutputStream dos = null;
    DataInputStream inStream = null;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    int bytesAvailable, bufferSize;
    byte[] buffer;

    String urlString = "*******<My URL>*******";
    try {
        // ------------------ CLIENT REQUEST
        // FileInputStream fileInputStream = new FileInputStream(new
        // File(selectedPath) );

        // open a URL connection to the Servlet

        URL url = new URL(urlString);
        // Open a HTTP connection to the URL
        conn = (HttpURLConnection) url.openConnection();
        // Allow Inputs
        conn.setDoInput(true);
        // Allow Outputs
        conn.setDoOutput(true);
        // Don't use a cached copy.
        conn.setUseCaches(false);

        conn.setChunkedStreamingMode(0);
        // Use a post method.
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type",
                "multipart/form-data;boundary=" + boundary);
        dos = new DataOutputStream(conn.getOutputStream());

        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"wheeze_file\";filename="
                + fileName + lineEnd);
        dos.writeBytes(lineEnd);

        // create a buffer of maximum size
        bytesAvailable = is.available();
        streamSize = bytesAvailable;
        bufferSize = 2048;
        buffer = new byte[bufferSize];
        // read file and write it into form...
        int i = 0;
        int length = 0;
        while ((length = is.read(buffer, 0, bufferSize)) > 0) {
            if (isCancelled()) {
                Toast.makeText(getApplicationContext(), "Cancelled",
                        Toast.LENGTH_SHORT).show();
                return null;
            }
            dos.write(buffer, 0, length);
            bytesAvailable = is.available();

            // bufferSize = Math.min(bytesAvailable, maxBufferSize);

            publishProgress(streamSize, bytesAvailable);
            // Log.v("Progress",""+streamSize+" : "+bytesAvailable);
        }
        // send multipart form data necesssary after file data...
        dos.writeBytes(lineEnd);

        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"data[authentication][email]\""
                + lineEnd);
        dos.writeBytes(lineEnd);
        dos.writeBytes(username);
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"data[authentication][password]\""
                + lineEnd);
        dos.writeBytes(lineEnd);
        dos.writeBytes(enc_password);
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"method\""
                + lineEnd);
        dos.writeBytes(lineEnd);
        dos.writeBytes("uploadWheezeFile");
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
        // close streams
        Log.e("Debug", "File is written");

        // Log.v("Conn status", "Disconnected");

    } catch (MalformedURLException ex) {
        ex.printStackTrace();
        Log.e("Debug", "MURLExerror: " + ex.getMessage(), ex);
    } catch (IOException ioe) {
        ioe.printStackTrace();
        Log.e("Debug", "IOEx error: " + ioe.getMessage(), ioe);
        uploadTask.cancel(true);
        return null;
    } finally {
        try {
            is.close();
            dos.flush();
            dos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    // ------------------ read the SERVER RESPONSE
    try {
        inStream = new DataInputStream(conn.getInputStream());

        if ((jsonResponse = inStream.readLine()) != null) {
            Log.e("Debug", "Server Response " + jsonResponse);

        } else {
            jsonResponse = "";
        }

        inStream.close();
        conn.disconnect();
        //
    } catch (IOException ioex) {
        ioex.printStackTrace();
        Log.e("Debug", "error: " + ioex.getMessage(), ioex);
    }

    return jsonResponse;
}

如果接收服务器支持,您可以使用 Content-Range 标头来标识续传上传。 Google-Drive API 支持它。如果你自己推出,我会遵循谷歌使用的模式:

  • 开始上传并获取会话标识符。
  • 当上传中断时,请等待互联网恢复。
  • 恢复上传时,首先询问服务器已接收了多少字节。 (*)
  • 使用服务器状态后的下一个字节继续上传。

(*) 请注意,当我之前推出自己的版本时,我在上传的最后 KB 中添加了来自服务器的编码响应,只是为了验证它在传输中没有损坏。但是,我在生产中从未见过服务器收到损坏数据的情况。

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

如何在 Android 中恢复文件上传过程? 的相关文章

随机推荐

  • 使用 Jquery $.get() 逐行检索文本文件

    是否可以逐行检索txt文件内容 现在我正在使用这段代码 var file http plapla com pla txt function getFile get file function txt save txt responseTex
  • geom_wordcloud :这是一个白日梦吗

    我处理一些跨各种分组变量的文本数据 我正在考虑创建一种使用 Ian Fellows 制作多面文字云图的方法wordcloud包裹 我喜欢这种方式ggplot2方面的社会变量 我正在决定如何解决这个问题 多面词云图 是否可以使用 Fellow
  • 为什么使用隐藏字段?

    我经常看到 Web 应用程序中使用了很多隐藏字段 我所编写的代码是为了使用大量隐藏字段以及来回发送给它们的可见字段的数据值而编写的 虽然我不明白为什么使用隐藏字段 我几乎总能想出在不使用隐藏字段的情况下解决相同问题的方法 隐藏字段如何帮助设
  • Java 进程挂在 IOUtils 上。疑似死锁

    我有一个 java 进程挂在调用中IOUtils toString使用以下代码 String html try html IOUtils toString someUrl openStream utf 8 process hangs on
  • Vue.js 动态类名?

    我需要根据评论等级进行颜色降级 我希望在 Vue js 中完成一些事情 如下所示 div class review 在我的方法中我有这样的东西 reviewColor return green 不幸的是 这并没有为我提供 green 班级
  • 将解决方案中的所有项目重新定位到 .NET 4.5.2

    我在 Visual Studio 2012 中有一个解决方案 其中包含 170 个 C 项目 我需要将所有项目从 NET Framework 4 0 重新定位到 4 5 2 我更喜欢让 Visual Studio 通过进入每个项目的属性 更
  • 将 JSON 日期转换为 MM/DD/YYYY 格式?

    我的客户收到一个包含多列的电子表格 其中一列是 日期 只有日期被格式化为Date 1292291582263 0700 看起来是一个 JSON 日期 我需要在此电子表格代码 VBA 的其他位置转换并使用 MM DD YYYY 格式的 JSO
  • Bootstrap 3 - 带侧边栏的 Scrollspy

    我正在使用 Bootstrap 3 我想重新创建与侧边栏相同的功能Bootstrap 站点上的文档 http getbootstrap com javascript 下面是我的代码 它也在这里 http bootply com 82119
  • 使用带有信任证书的 ClickOnce 进行 WPF 应用程序部署

    我已使用测试证书将 WPF 应用程序部署到生产环境 现在 我必须更改测试证书并购买新证书 我浏览了 MSDN 网站 但无法得出结论该怎么办 所以 我需要澄清以下内容 在哪里购买这些证书文件以及它是什么类型的证书 我们必须在客户端系统上安装这
  • MSBuild 无法使用临时密钥签署 ClickOnce 清单(错误 MSB3326 和 MSB3321)

    我正在尝试构建 ClickOnceWindows 窗体 http en wikipedia org wiki Windows FormsWindows Server 计算机上的项目 NET 3 5 Visual Studio 2010 为了
  • create_proc_entry() 的替代方法是什么

    As create proc entry函数已被弃用 它的替代品是什么 我试图使用创建一个简单的过程条目create proc entry但得到了这个错误 错误 函数 create proc entry 的隐式声明 我摸索着create p
  • 如何创建支持空值的结构?

    我是 C 新手 在 C 中 我无法将结构的值设置为 null 如何创建支持 null 值的结构 通过使用 Generic Nullable 类来包装结构和值类型 可以使其可为空 例如 Nullable
  • 如何将字符串转换为字母数字并将空格转换为破折号? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想获取一个字符串 去掉所有非字母数字字符并将所有空格转换为破折号 每当我想将标题或其他字符串转换为 URL slug
  • Javascript - 带蓝牙键盘的 iPad Tab 键检测

    我有一个文本字段 用户可以在其中输入数据 他们可以使用 Tab 键 然后字段会缩进 除了带有蓝牙键盘的 ios 之外 这对所有设备都适用 如果我访问http www rapidtables com tools notepad htm htt
  • nmake:构建 OpenSSL 时未找到命令

    我正在尝试使用 git bash 上的此说明来遵循 Windows 上 OpenSSL 的安装说明 在 Windows 上 仅选择一个目标进行配置 perl Configure VC WIN32 VC WIN64A VC WIN64I VC
  • 怎样才能让Jasmine等待一个promise被解决或者被拒绝呢?

    我有一个特定的函数 我正在尝试使用 Angular 来测试它 该函数返回一个承诺 尽管在我的测试中我对 Promise 结果设定了期望 但 Jasmine 不会等待 Promise 得到解决或拒绝 警告 错误 规格 test 没有任何期望
  • 如何让JavaFX Chart NumberAxis只显示Integer值,而不是double值

    我正在尝试创建一个图表 其轴旨在显示员工人数 因此它必须仅显示整数 但我发现这并不像我已经尝试过的那么容易yAxis setTickUnit 1 但当值很小时它就不起作用 等等 最大值是3 它仍然会显示0 5 1 5 我只想要刻度值 如1
  • 基准测试 - 如何计算发送到 CPU 的指令数以查找消耗的 MIPS

    假设我有一个软件并想使用黑盒子 https en wikipedia org wiki Black box testing方法 我有一个 3 0GHz CPU 有 2 个插槽和 4 个核心 如您所知 为了找出每秒指令数 IPS 我们必须使用
  • 如何在 Eclipse 中打开现有的 Clojure 项目?

    我尝试按照通常的方式进行操作文件 gt 导入 gt 常规 gt 现有项目 对于java项目 但是eclipse看不到clojure项目并且无法打开它 你知道为什么吗 Install 逆时针 http doc ccw ide org docu
  • 如何在 Android 中恢复文件上传过程?

    我正在使用此代码在服务器上上传文件 但我想要这样的功能 如果在过程中由于网络丢失或任何其他中断而停止 那么它不应该从第二次开始上传 来自服务器的响应也是可定制的 在安卓上可以吗 我应该使用什么方法来做到这一点 请指导我 如果可能的话 请向我