Volley上传文件

来源:互联网 发布:mac os x 开机启动项 编辑:程序博客网 时间:2024/05/04 17:48

Volley上传文件:

public class UploadFileRequest extends Request<JSONObject> {    public static final String TAG = UploadFileRequest.class.getSimpleName();    private static final String CHARSET = "utf-8"; //设置编码    String BOUNDARY = UUID.randomUUID().toString();  //边界标识   随机生成    String PREFIX = "--", LINE_END = "\r\n";    String CONTENT_TYPE = "multipart/form-data";   //内容类型    /**     * 正确数据的时候回掉用     */    private Response.Listener<JSONObject> mListener;    /*请求 数据通过参数的形式传入*/    private List<File> mListItem;    public UploadFileRequest(int method, String url, List<File> listItem,                             Response.Listener<JSONObject> listener,                             Response.ErrorListener errorListener) {        super(method, url, errorListener);        this.mListener = listener;        setShouldCache(false);        mListItem = listItem;        setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));    }    public UploadFileRequest(int method, String url, File file,                             Response.Listener<JSONObject> listener,                             Response.ErrorListener errorListener) {        super(method, url, errorListener);        ArrayList<File> files = new ArrayList<File>();        files.add(file);        this.mListener = listener;        setShouldCache(false);        mListItem = files;        setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));    }    /**     * 这里开始解析数据     *     * @param response Response from the network     * @return     */    @Override    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {        try {            String jsonString = new String(response.data,                    HttpHeaderParser.parseCharset(response.headers, CHARSET));            return Response.success(new JSONObject(jsonString),                    HttpHeaderParser.parseCacheHeaders(response));        } catch (UnsupportedEncodingException e) {            return Response.error(new ParseError(e));        } catch (JSONException je) {            return Response.error(new ParseError(je));        }    }    @Override    protected void deliverResponse(JSONObject response) {        mListener.onResponse(response);    }    @Override    public byte[] getBody() throws AuthFailureError {        if (mListItem == null || mListItem.size() == 0) {            return super.getBody();        }        ByteArrayOutputStream bos = new ByteArrayOutputStream();        int N = mListItem.size();        File file;        for (int i = 0; i < N; i++) {            file = mListItem.get(i);            StringBuffer sb = new StringBuffer();            sb.append(PREFIX);            sb.append(BOUNDARY);            sb.append(LINE_END);            /**             * name里面的值为服务器端需要key   只有这个key 才可以得到对应的文件             * filename是文件的名字,包含后缀名的   比如:abc.png             */            sb.append(                    "Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() +                            "\"" + LINE_END);            sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END);            sb.append(LINE_END);            try {                bos.write(sb.toString().getBytes(CHARSET));                InputStream is = new FileInputStream(file);                byte[] bytes = new byte[1024];                int len = 0;                while ((len = is.read(bytes)) != -1) {                    bos.write(bytes, 0, len);                }                is.close();            } catch (IOException e) {                e.printStackTrace();            }        }        try {            bos.write(LINE_END.getBytes(CHARSET));            byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes(CHARSET);            bos.write(end_data);            bos.flush();        } catch (IOException e) {            e.printStackTrace();        }        return bos.toByteArray();    }    @Override    public String getBodyContentType() {        return CONTENT_TYPE + ";boundary=" + BOUNDARY;    }    private HashMap<String, String> map;    public void setHeader(HashMap<String, String> map) {        this.map = map;    }    @Override    public Map<String, String> getHeaders() throws AuthFailureError {        if (null != map) {            return map;        }        return super.getHeaders();    }}
0 0