【问题标题】:Save volley http stream/octet byte[] response to pdf file将 volley http 流/八位字节 [] 响应保存到 pdf 文件
【发布时间】:2018-04-18 12:55:42
【问题描述】:

我正在开发一个需要从 api 保存 pdf 文件的 android 应用程序。所以我不得不将 Request volley 类扩展为 ByteArray 类:

package br.com.tarcisojunior.myapp;

import android.support.annotation.NonNull;

import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;

/**
 * Created by tarcisojunior on 18/04/18.
 */

public class ByteArrayRequest extends Request<byte[]> {
    private final Response.Listener<byte[]> mListener;


    public ByteArrayRequest(String url, Response.Listener<byte[]> listener,
                       Response.ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }

    public ByteArrayRequest(int method, String url, Response.Listener<byte[]> listener, Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;

    }


    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    protected void deliverResponse(byte[] response) {
        if(null != mListener){
            mListener.onResponse(response);
        }
    }

    @Override
    public String getBodyContentType() {
        return "application/octet-stream";
    }

}

我的 Activity 我正在调用 ByteArrayRequest 来执行 api 请求:

private void getCarnePDF(final int empreendimento,final int coligada,final String quadra,final String lote){ 请求队列请求队列; ByteArrayRequest 请求;

requestQueue = Volley.newRequestQueue(this);

request = new ByteArrayRequest(Request.Method.GET, getString(R.string.baseUrl) + getString(R.string.carnePdfUrl),
        new Response.Listener<byte[]>() {
            @Override
            public void onResponse(byte[] response) {
                Log.i("getBilletCard", response.toString());
                try {
                    byte[] bytes = response;
                    saveToFile(bytes, "card.pdf");
                }catch (Exception e){
                    Toast.makeText(BilletCardActivity.this, "Erro ao converter resposta", Toast.LENGTH_LONG).show();
                }
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }){

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> headers = new HashMap<String, String>();
        //headers.put("Content-Type", "application/json");
        headers.put("token", token);
        headers.put("empreendimento", String.valueOf(empreendimento));
        headers.put("coligada", String.valueOf(coligada));
        headers.put("quadra", quadra);
        headers.put("lote",lote);
        return headers;
    }
};

requestQueue.add(request);

}

在监听器中,saveToFile 函数应该创建 pdf 文件。 pdf 文件已创建,但引发错误“无法打开文件”。这是我的 saveToFile 函数:

public void saveToFile(byte[] byteArray, String pFileName){
        File f = new File(Environment.getExternalStorageDirectory() + "/myappname");
        if (!f.isDirectory()) {
            f.mkdir();
        }

        String fileName = Environment.getExternalStorageDirectory() + "/myappname/" + pFileName;

        try {

            FileOutputStream fPdf = new FileOutputStream(fileName);

            fPdf.write(byteArray);
            fPdf.flush();
            fPdf.close();
            Toast.makeText(this, "File successfully saved", Toast.LENGTH_LONG).show();
        } catch (FileNotFoundException e) {
            Toast.makeText(this, "File create error", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            Toast.makeText(this, "File write error", Toast.LENGTH_LONG).show();
        }

}

文件创建成功,但打不开

当我从 Postman 尝试相同的端点时,一切正常,文件已成功保存并打开

【问题讨论】:

  • 您是否比较了原始文件和副本的字节数?
  • 当我从 Postman 向同一端点发出请求时,文件已成功下载并保存,当我在 Finder 中找到文件时,文件大小为 123 K,但正如我们在第一张图片中看到的,android保存的文件大小为 120Kb。编辑问题以添加来自 Postman 的响应标头

标签: java android android-volley


【解决方案1】:

在将 Postman 标头与我的代码进行比较后,我发现请求中缺少“Cache-control=no-cache”标头。

添加此标头后,文件已正确下载。

所以改成这样: . . . . .

 @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> headers = new HashMap<String, String>();
        headers.put("Cache-Control", "no-cache");
        headers.put("token", token);
        headers.put("empreendimento", String.valueOf(empreendimento));
        headers.put("coligada", String.valueOf(coligada));
        headers.put("quadra", quadra);
        headers.put("lote",lote);
        return headers;
    }

。 . . . .

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 2018-09-12
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2019-02-25
    • 2019-05-13
    相关资源
    最近更新 更多