【发布时间】:2016-03-04 12:12:36
【问题描述】:
我正在制作一个应用程序,我必须使用Volley 上传一张图片。我试图谷歌,但没有找到类似的东西。使用Volley发布此图片时,如何对图片进行分段上传并添加user_id等参数?
在我的情况下,使用 Retrofit 不是一个选项。
【问题讨论】:
-
是的,使用凌空抽射:试试这个stackoverflow.com/a/29430765/5275436
我正在制作一个应用程序,我必须使用Volley 上传一张图片。我试图谷歌,但没有找到类似的东西。使用Volley发布此图片时,如何对图片进行分段上传并添加user_id等参数?
在我的情况下,使用 Retrofit 不是一个选项。
【问题讨论】:
首先创建一个文件MultipartRequest如下:
public class MultipartRequest extends Request<String> {
private MultipartEntityBuilder entity = MultipartEntityBuilder.create();
private final Response.Listener<String> mListener;
private final File file;
private final HashMap<String, String> params;
public MultipartRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener, File file, HashMap<String, String> params)
{
super(Method.POST, url, errorListener);
mListener = listener;
this.file = file;
this.params = params;
buildMultipartEntity();
buildMultipartEntity2();
}
private void buildMultipartEntity()
{
entity.addBinaryBody(KEY_IMAGE, file, ContentType.create("image/jpeg"), file.getName());
entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));
try
{
for ( String key : params.keySet() ) {
entity.addPart(key, new StringBody(params.get(key)));
}
}
catch (UnsupportedEncodingException e)
{
VolleyLog.e("UnsupportedEncodingException");
}
}
@Override
public String getBodyContentType()
{
return entity.build().getContentType().getValue();
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = super.getHeaders();
if (headers == null
|| headers.equals(Collections.emptyMap())) {
headers = new HashMap<String, String>();
}
headers.put("Accept", "application/json");
return headers;
}
@Override
public byte[] getBody() throws AuthFailureError
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
entity.build().writeTo(bos);
}
catch (IOException e)
{
VolleyLog.e("IOException writing to ByteArrayOutputStream");
}
return bos.toByteArray();
}
/**
* copied from Android StringRequest class
*/
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
}
@Override
protected void deliverResponse(String response) {
mListener.onResponse(response);
}}
在您的活动中,只需按如下方式提出多部分请求:
public void uploadImage()
{
try {
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Loading...");
pDialog.show();
HashMap params = new HashMap<String, String>();
params.put(KEY_NAME, name);
MultipartRequest sr = new MultipartRequest( UPLOAD_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if ((pDialog != null) && pDialog.isShowing()) {
pDialog.dismiss();
}
Log.d("file", f + "");
Log.d("", ".......response====" + response.toString());
////////
try {
JSONObject object = new JSONObject(response);
String serverCode = object.getString("code");
if (serverCode.equalsIgnoreCase("0")) {
}
if (serverCode.equalsIgnoreCase("1")) {
try {
if ("1".equals(serverCode)) {
JSONObject object1 = object.getJSONObject("data");
}
}
【讨论】:
使用改造 2:
您需要使用 OkHttp 的 RequestBody 类并将您的文件封装到请求正文中(即您的用户 ID)。
1) 创建接口
public interface FileUploadService {
@Multipart
@POST("/upload")
Call<String> upload(
@Part("myfile\"; filename=\"image.png\" ") RequestBody file,
@Part("userid") RequestBody userid);
}
2) 活动中的代码:
FileUploadService service =
ServiceGenerator.createService(FileUploadService.class);
String userid = "your_userid";
RequestBody data =
RequestBody.create(MediaType.parse("multipart/form-data"), userid);
File file = new File("path/to/your/file");
RequestBody requestBody =
RequestBody.create(MediaType.parse("multipart/form-data"), file);
Call<String> call = service.upload(requestBody, data);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.e("Upload", t.getMessage());
}
});
参考链接:https://futurestud.io/blog/retrofit-2-how-to-upload-files-to-server
【讨论】: