【发布时间】: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 向同一端点发出请求时,文件已成功下载并保存,当我在 Finder 中找到文件时,文件大小为 123 K,但正如我们在第一张图片中看到的,android保存的文件大小为 120Kb。编辑问题以添加来自 Postman 的响应标头
标签: java android android-volley