volley 멀티 파트 업로드
/**
* 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를 직접 검색하십시오.자바는 많이 찾을 수 있을 거예요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.