volley 멀티 파트 업로드

5818 단어
골동품 볼리(retrofit 등 신예들에 비해 학습 곡선이 완만하기 때문에 프로젝트는 빠른 접속을 위해 선택했다.한 가지 요구 사항은 요청을 통해 서버에 여러 장의 사진을 올리는 것이다. 곧 게이허브에 가서 다른 사람이 만든 바퀴를 찾았다. 코드는 다음과 같다.
/**
 * Custom request to make multipart header and upload file.
 *
 * Sketch Project Studio
 * Created by Angga on 27/04/2016 12.05.
 */
public class VolleyMultipartRequest extends Request {
    private final String twoHyphens = "--";
    private final String lineEnd = "\r
"; private final String boundary = "apiclient-" + System.currentTimeMillis(); private Response.Listener mListener; private Response.ErrorListener mErrorListener; private Map mHeaders; /** * Default constructor with predefined header and post method. * * @param url request destination * @param headers predefined custom header * @param listener on success achieved 200 code from request * @param errorListener on error http or library timeout */ public VolleyMultipartRequest(String url, Map headers, Response.Listener listener, Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; this.mHeaders = headers; } /** * Constructor with option method and default header configuration. * * @param method method for now accept POST and GET only * @param url request destination * @param listener on success event handler * @param errorListener on error event handler */ public VolleyMultipartRequest(int method, String url, Response.Listener listener, Response.ErrorListener errorListener) { super(method, url, errorListener); this.mListener = listener; this.mErrorListener = errorListener; } ... ... @Override protected Response 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); } /** * Parse string map into data output stream by key and value. * * @param dataOutputStream data output stream handle string parsing * @param params string inputs collection * @param encoding encode the inputs, default UTF-8 * @throws IOException */ private void textParse(DataOutputStream dataOutputStream, Map params, String encoding) throws IOException { try { for (Map.Entry entry : params.entrySet()) { buildTextPart(dataOutputStream, entry.getKey(), entry.getValue()); } } catch (UnsupportedEncodingException uee) { throw new RuntimeException("Encoding not supported: " + encoding, uee); } } /** * Parse data into data output stream. * * @param dataOutputStream data output stream handle file attachment * @param data loop through data * @throws IOException */ private void dataParse(DataOutputStream dataOutputStream, Map data) throws IOException { for (Map.Entry entry : data.entrySet()) { buildDataPart(dataOutputStream, entry.getValue(), entry.getKey()); } } /** * Write string data into header and data output stream. * * @param dataOutputStream data output stream handle string parsing * @param parameterName name of input * @param parameterValue value of input * @throws IOException */ private void buildTextPart(DataOutputStream dataOutputStream, String parameterName, String parameterValue) throws IOException { dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + parameterName + "\"" + lineEnd); //dataOutputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd); dataOutputStream.writeBytes(lineEnd); dataOutputStream.writeBytes(parameterValue + lineEnd); } ... ... }

전체 클래스가 너무 길어서 일부분만 캡처할 수 있습니다. 사용 중 겪는 문제는 파일을 업로드할 때 다른 매개 변수와 매개 변수에 중국어 문자열이 있을 때 서버에 도착하면 코드가 엉망이고 영어는 문제가 없다는 것입니다.처음에accepted라는 헤더 설정의 문제가 의심되었는데,utf-8로 바꾸는 것은 여전히 문제가 있다.만약 매개 변수가utf-8로 먼저 encode를 한 번 사용하면 서버도 상응하는 수정을 해야 한다.decode를 먼저 입고해야 한다.iOS 측에 문제가 없기 때문에 다음 방안을 고려하지 않았다.
다른 인터페이스에서 중국어 파라미터를 사용하는 것은 문제없습니다. 따라서 리퀘스트를 업로드하는 코드를 따로 고려합니다.함수를 처리할 때 이 종류는
dataOutputStream.writeBytes(parameterValue + lineEnd);

직접 write Bytes입니다. 자바의 문자는 더블 바이트이기 때문에 이 인자를 사용하면 높은 8자리는 버려집니다.문제를 해결하려면 다음과 같이 하십시오.
dataOutputStream.write(parameterValue.getBytes());
dataOutputStream.writeBytes(lineEnd);

gayhub에서 검색한 결과 많은 라이브러리에서 이 파일을 직접 사용했는데 아마도 영문 매개 변수를 계속 사용했을 뿐 문제가 없었을 것이다. 이것은 뇌를 묻은 것과 같다.이 종류의 전체 코드를 원한다면, Volley Multipart Request를 직접 검색하십시오.자바는 많이 찾을 수 있을 거예요.

좋은 웹페이지 즐겨찾기