新api中不推荐使用HttpConnectionParams的Android多部分图像上载

新api中不推荐使用HttpConnectionParams的Android多部分图像上载,android,json,file-upload,multipartform-data,multipart,Android,Json,File Upload,Multipartform Data,Multipart,我正在使用MultiPartRequester类将多部分图像上载到服务器,但我发现其中一些部分不推荐使用。例如,HttpConnectionParams、getConnectionManager()等。那么,有没有人有新的解决方案,而该解决方案在文件上载的新API级别上不受欢迎 我正在使用这个代码 公共类多部分请求程序{ 私人地图; 专用AsyncTaskCompleteListener mAsynclistener; 专用int服务代码; 私有HttpClient HttpClient; 私

我正在使用MultiPartRequester类将多部分图像上载到服务器,但我发现其中一些部分不推荐使用。例如,HttpConnectionParams、getConnectionManager()等。那么,有没有人有新的解决方案,而该解决方案在文件上载的新API级别上不受欢迎

我正在使用这个代码

公共类多部分请求程序{
私人地图;
专用AsyncTaskCompleteListener mAsynclistener;
专用int服务代码;
私有HttpClient HttpClient;
私人活动;
私有异步HttpRequest请求;
私有静态最终字符串标记=“MultiPartRequester”;
公共多方请求程序(活动、映射、,
int serviceCode,AsyncTaskCompleteListener(异步任务CompleteListener){
this.map=map;
this.serviceCode=serviceCode;
这个。活动=活动;
}
类AsyncHttpRequest扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
映射。删除(“url”);
试一试{
HttpPost HttpPost=新的HttpPost(URL[0]);
httpclient=新的DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(
httpclient.getParams(),600000);
MultipartEntityBuilder=MultipartEntityBuilder
.create();
for(字符串键:map.keySet()){
if(key.equalsIgnoreCase(AndyConstants.Params.PICTURE)){
文件f=新文件(map.get(key));
builder.addBinaryBody(键,f,
ContentType.MULTIPART_FORM_DATA,f.getName();
}否则{
builder.addTextBody(键,map.get(键),ContentType
.create(“text/plain”,MIME.UTF8_字符集));
}
Log(TAG,key+“--->”+map.get(key));
}
setEntity(builder.build());
ActivityManager manager=(ActivityManager)活动
.getSystemService(Context.ACTIVITY\u服务);
if(manager.getMemoryClass()<25){
gc();
}
HttpResponse response=httpclient.execute(httppost);
String ResponseBy=EntityUtils.toString(
response.getEntity(),“UTF-8”);
reurn responseBody;
}捕获(例外e){
e、 printStackTrace();
}捕获(OutOfMemoryError oume){
gc();
}最后{
if(httpclient!=null)
httpclient.getConnectionManager().shutdown();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串响应){
if(mAsynclistener!=null){
mAsynclistener.onTaskCompleted(响应,服务代码);
}
}
}
公共任务(){
请求。取消(true);
Log(标记“任务已完成”);
}

}
是的,由于Apache HTTPClient现在已不推荐使用,您可以使用HTTPURLConnection 我使用此代码通过SMTP通过gmail发送多个文件,您可以修改代码并使用它

 public class sendMails extends AsyncTask<String, String, String> {
    ProgressDialog progress;

    public sendMails(Context context) {
        progress = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        progress.setMessage("Contacting Server!" + "\nPlease make sure internet is working!");
        progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progress.setIndeterminate(true);
        progress.show();
        progress.setCancelable(false);
    }

    @Override
    protected String doInBackground(String... params) {
        System.out.println("asd");
        // Get system properties
        Properties props = System.getProperties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");

        // Get session

        Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("EMAIL ADDRESS", "password");


// return new PasswordAuthentication("", "password");
            }
        });
        try {
            // Define message
            MimeMessage message = new MimeMessage(session);

            message.setFrom(new InternetAddress("EMAIL ADDRESS"));

            // Set To: header field of the header.
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(email));


            message.setSubject("Your Photos");
            String text = "Content";
            message.setText(text);
            Multipart multipart = new MimeMultipart("mixed");
            for (String str : listOfImages) {
                System.out.println(str);
                MimeBodyPart messageBodyPart = new MimeBodyPart();
                DataSource source = new FileDataSource(str);
                messageBodyPart.setDataHandler(new DataHandler(source));
                messageBodyPart.setFileName(source.getName());
                multipart.addBodyPart(messageBodyPart);
            }

            message.setContent(multipart);
            // Send message
            Transport.send(message);
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return "";
    }

    @Override
    protected void onPostExecute(String s) {

        setupScreenOnReciever();

        progress.dismiss();
    }

}
public类sendMails扩展异步任务{
进程对话进程;
公共发送邮件(上下文){
进度=新建进度对话框(上下文);
}
@凌驾
受保护的void onPreExecute(){
progress.setMessage(“正在联系服务器!”+“\n请确保internet正在工作!”);
progress.setProgressStyle(ProgressDialog.STYLE\u微调器);
progress.setUndeterminate(true);
progress.show();
进度。可设置可取消(false);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
系统输出打印项次(“asd”);
//获取系统属性
Properties props=System.getProperties();
put(“mail.smtp.host”、“smtp.gmail.com”);
props.put(“mail.smtp.socketFactory.port”,“465”);
put(“mail.smtp.socketFactory.class”、“javax.net.ssl.SSLSocketFactory”);
props.put(“mail.smtp.auth”,“true”);
props.put(“mail.smtp.port”,“465”);
//获取会话
Session Session=Session.getDefaultInstance(props,new javax.mail.Authenticator(){
受保护的密码身份验证getPasswordAuthentication(){
返回新密码身份验证(“电子邮件地址”、“密码”);
//返回新密码身份验证(“,“密码”);
}
});
试一试{
//定义消息
MimeMessage message=新MimeMessage(会话);
message.setFrom(新的Internet地址(“电子邮件地址”);
//设置为:标题的标题字段。
message.setRecipients(message.RecipientType.TO,
InternetAddress.parse(电子邮件));
message.setSubject(“您的照片”);
String text=“Content”;
message.setText(文本);
Multipart Multipart=新的mimemmultipart(“混合”);
for(字符串str:listOfImages){
系统输出打印项次(str);
MimeBodyPart messageBodyPart=新的MimeBodyPart();
数据源=新文件数据源(str);
setDataHandler(新的DataHandler(源));
messageBodyPart.setFileName(source.getName());
multipart.addBodyPart(messageBodyPart);
}
message.setContent(多部分);
//发送消息
传输。发送(消息);
}捕获(地址e){
e、 printStackTrace();
}捕获(消息异常e){
e、 printStackTrace();
}
返回“”;
}
@凌驾
受保护的void onPostExecute(字符串s){
setupScreenOnReceiver();
进步。解散();
}
}

这是FileUploadMultipartRequest类:

/**
 * Multipart request for sending files over http
 * also can return generic type of response data
 * @param <T> the type of data for http responses
 */
public class FileUploadMultipartRequest<T> extends BaseRequest<T>
{
    private static final MediaType JSON = MediaType.parse("application/json");
    private File[] files;
    private String jsonString;
    private RequestBody requestBody;

    public FileUploadMultipartRequest(String url, Map<String, String> headers, String jsonString, OnEmptyResponseListener listener, ErrorTypeListener errorListener, File... files)
    {
        super(Method.POST, url, headers, listener, new ErrorListenerImpl(errorListener));
        this.jsonString = jsonString;
        this.files = files;
    }

    public FileUploadMultipartRequest(String url, Map<String, String> headers, String jsonString, Type responseType, Response.Listener listener, ErrorTypeListener errorListener, File... files)
    {
        super(Method.POST, url, headers, responseType, listener, new ErrorListenerImpl(errorListener));
        this.jsonString = jsonString;
        this.files = files;
    }

    @Override
    public String getBodyContentType()
    {
        return buildMultipartEntity().contentType().toString();
    }

    @Override
    public byte[] getBody() throws AuthFailureError
    {
        Buffer buffer = new Buffer();
        try
        {
            buildMultipartEntity().writeTo(buffer);
        } catch (IOException e)
        {
            VolleyLog.e("IOException writing to ByteArrayOutputStream");
        }
        return buffer.readByteArray();
    }

    private RequestBody buildMultipartEntity()
    {

        if (requestBody == null)
        {
            MultipartBuilder multipartBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);

            multipartBuilder.addPart(
                    Headers.of("Content-Disposition", "form-data; name=json-part"),
                    RequestBody.create(JSON, jsonString));

            for (File file : files)
            {
                String contentType = URLConnection.guessContentTypeFromName(file.getName());
                multipartBuilder.addFormDataPart("files-part", file.getName(),
                        RequestBody.create(MediaType.parse(contentType), file));
            }

            requestBody = multipartBuilder.build();
        }
        return requestBody;
    }

}
/**
 * this a abstract request class for handling http http responses
 * note : all volley request should extend this class for http request
 *
 * @param <T> the type of data for http responses
 */
public abstract class BaseRequest<T> extends Request<T>
{
    private final Map<String, String> headers;

    /**
     * the type response that {@link com.android.volley.Response.Listener} should return
     */
    private Type responseType;

    /**
     * generic listener for successful http request
     */
    private Response.Listener<T> listener;

    /**
     * constructor for request that returns data type {@link T}
     *
     * @param method        http verb e.g. POST, GET & etc
     * @param url           request URL
     * @param headers       http headers
     * @param responseType  type of data that response should return
     * @param listener      event for successful request
     * @param errorListener event for failed request
     */
    public BaseRequest(int method, String url, Map<String, String> headers, Type responseType, Response.Listener listener, ErrorListenerImpl errorListener)
    {
        super(method, url, errorListener);
        this.headers = headers;
        this.responseType = responseType;
        //noinspection unchecked
        this.listener = listener;
    }

    /**
     * constructor for requests with no returning data
     *  @param method                  http verb e.g. POST, GET & etc
     * @param url                     request URL
     * @param headers                 http headers
     * @param onEmptyResponseListener event for successful request (but no data return)
     * @param errorListener           event for failed request
     */
    public BaseRequest(int method, String url, Map<String, String> headers, OnEmptyResponseListener onEmptyResponseListener, ErrorListenerImpl errorListener)
    {
        super(method, url, errorListener);
        this.headers = headers;
        //noinspection unchecked
        listener = new OnEmptyResponseImpl(onEmptyResponseListener);
    }

    protected Response<T> parseNetworkResponse(NetworkResponse response)
    {

        // if response type is null so just pass null to success event
        if (this.responseType == null && new String(response.data).isEmpty())
        {
            return Response.success(null, HttpHeaderParser.parseCacheHeaders(response));
        }

        // if response type is specified
        try
        {
            Gson gson = new Gson();
            String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            // we use GSON to reflect response data to the generic type and pass to success event
            T parseObject = gson.fromJson(json, responseType);
            return Response.success(parseObject, HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e)
        {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e)
        {
            return Response.error(new ParseError(e));
        }
    }


    @Override
    protected void deliverResponse(T response)
    {
        if (listener != null)
        {
            // call successful response event when listener not empty
            listener.onResponse(response);
        }
    }

    @Override
    protected void onFinish()
    {
        super.onFinish();
        listener = null;
    }

    /**
     * this class forward response event to {@link com.khosravi.mehrdadz.garagesale.Network.RequestType.BaseRequest.OnEmptyResponseListener}
     * when volley {@link com.android.volley.Response.Listener} is called
     */
    private static class OnEmptyResponseImpl implements Response.Listener
    {
        OnEmptyResponseListener onEmptyResponseListener;

        /**
         * @param onEmptyResponseListener interface for response with not data return
         */
        public OnEmptyResponseImpl(OnEmptyResponseListener onEmptyResponseListener)
        {
            this.onEmptyResponseListener = onEmptyResponseListener;
        }

        /**
         * we call {@link com.khosravi.mehrdadz.garagesale.Network.RequestType.BaseRequest.OnEmptyResponseImpl#onEmptyResponseListener}
         * when volley listener is class so no null object passed to the event
         *
         * @param response
         */
        @Override
        public void onResponse(Object response)
        {
            onEmptyResponseListener.OnEmptyResponse();
        }
    }

    /**
     * interface for http response with no returning data
     */
    public interface OnEmptyResponseListener
    {
        void OnEmptyResponse();
    }

    public Map<String, String> getHeaders() throws AuthFailureError
    {
        return this.headers != null ? this.headers : super.getHeaders();
    }
}
@SuppressWarnings("JavaDoc")
/**
 * Gson request that return generic type of response data
 * @param <T> the type of data for http responses
 */
public class GsonRequest<T> extends BaseRequest<T>
{
    protected static final String PROTOCOL_CHARSET = "utf-8";
    /**
     * Content type for request.
     */
    private static final String PROTOCOL_CONTENT_TYPE =
            String.format("application/json; charset=%s", PROTOCOL_CHARSET);

    /**
     * message body of http request
     */
    private final String requestBody;

    /**
     * Request return response object of Type {@link T}
     * @param url
     * @param headers
     * @param type
     * @param listener
     * @param errorListener
     */
    public GsonRequest(String url, Map<String, String> headers, Type type, Listener<T> listener, ErrorTypeListener errorListener)
    {
        super(Method.GET, url, headers, type, listener, new ErrorListenerImpl(errorListener));
        requestBody = null;
    }

    /**
     * Request return response object of Type {@link T}
     * @param url
     * @param headers
     * @param jsonObject json object to send with request
     * @param type
     * @param listener
     * @param errorListener
     */
    public GsonRequest(String url, Map<String, String> headers, JSONObject jsonObject, Type type, Listener<T> listener, ErrorTypeListener errorListener)
    {
        super(Method.POST, url, headers, type, listener, new ErrorListenerImpl(errorListener));
        this.requestBody = jsonObject == null ? null : jsonObject.toString();
    }

    /**
     * Request return empty response
     * @param url
     * @param headers
     * @param jsonObject json object to send with request
     * @param listener
     * @param errorListener
     */
    public GsonRequest(String url, Map<String, String> headers, JSONObject jsonObject, OnEmptyResponseListener listener, ErrorTypeListener errorListener)
    {
        super(Method.POST, url, headers, listener, new ErrorListenerImpl(errorListener));
        this.requestBody = jsonObject == null ? null : jsonObject.toString();
    }

    /**
     * Request return empty response
     * @param url
     * @param headers
     * @param listener
     * @param errorListener
     */
    public GsonRequest(String url, Map<String, String> headers, BaseRequest.OnEmptyResponseListener listener, ErrorTypeListener errorListener)
    {
        super(Method.GET, url, headers, listener, new ErrorListenerImpl(errorListener));
        requestBody = null;
    }


    @Override
    public String getBodyContentType()
    {
        return PROTOCOL_CONTENT_TYPE;
    }

    @Override
    public byte[] getBody()
    {
        try
        {
            return requestBody == null ? null : requestBody.getBytes(PROTOCOL_CHARSET);
        } catch (UnsupportedEncodingException uee)
        {
            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
                    requestBody, PROTOCOL_CHARSET);
            return null;
        }
    }
}
你可以在我的请求中添加更多请求,并在任何地方调用它。 像这样:

MyRequest myRequest;
private HashMap<FrameLayout,File> Images;

myRequest = new MyRequest(context);
Images = new HashMap<>();

myRequest.UploadNewPic(Images.values().toArray(new File[Images.values().size()]),  new BaseRequest.OnEmptyResponseListener()
                    {
                        @Override
                        public void OnEmptyResponse()
                        {
                            Toast.makeText(getApplicationContext(), "added pics successfully", Toast.LENGTH_LONG).show();
                            finish();
                        }
                    }, new ErrorTypeListener()
                    {
                        @Override
                        public void onError(ErrorType errorType)
                        {

                        }
                    });
public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            // proccess all for protected resources with ImageRouteHandler
            routes.Add("ImagesRoute", new Route("res/{section}/{filename}", new ImageRouteHandler()));

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
然后像这样改变你的路线:

MyRequest myRequest;
private HashMap<FrameLayout,File> Images;

myRequest = new MyRequest(context);
Images = new HashMap<>();

myRequest.UploadNewPic(Images.values().toArray(new File[Images.values().size()]),  new BaseRequest.OnEmptyResponseListener()
                    {
                        @Override
                        public void OnEmptyResponse()
                        {
                            Toast.makeText(getApplicationContext(), "added pics successfully", Toast.LENGTH_LONG).show();
                            finish();
                        }
                    }, new ErrorTypeListener()
                    {
                        @Override
                        public void onError(ErrorType errorType)
                        {

                        }
                    });
public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            // proccess all for protected resources with ImageRouteHandler
            routes.Add("ImagesRoute", new Route("res/{section}/{filename}", new ImageRouteHandler()));

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
服务器端的示例代码:

public interface IUserManagement
    {
        void UploadNewPics( IEnumerable<string> imageUrls);
    }



    public class UserManagement : IUserManagement
    {
        public void UploadNewPics(IEnumerable<string> imageUrls)
        {

            using (var ctx = new Context())
            {

                foreach (var imageUrl in imageUrls)
                {
                    //save to data base
                    .
                    .
                    .
                }

                try
                {
                    ctx.SaveChanges();
                }
                catch (Exception e)
                {
                    throw;
                }
            }
        }
    }



        public class UserApiController : ApiController
{
    [HttpPost]
    public async Task<IHttpActionResult> UploadNewPics()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        var root = HttpContext.Current.Server.MapPath("~/Resources/Users/");
        var provider = new CustomMultipartFormDataStreamProvider(root);
        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            IUserManagement userManagement = new UserManagement();

            var imageUrls = provider.FileData.Select(x=> Path.GetFileName(x.LocalFileName));
            //userManagement.UploadUserImage(uploadImageJson, Path.GetFileName(imageFile.LocalFileName), (long)imageFile.Headers.ContentLength);
            userManagement.UploadNewPics(imageUrls);
        }
        catch (Exception e)
        {
            return InternalServerError();
        }
        return Ok();
    }
}
公共接口管理
{
无效上载新图片(IEnumerable ImageURL);
}
公共类用户管理:IUserManagement
{
public void UploadNewPics(IEnumerable ImageURL)
{
使用(var ctx=new Context())
{
foreach(imageUrls中的var imageUrl)
public interface IUserManagement
    {
        void UploadNewPics( IEnumerable<string> imageUrls);
    }



    public class UserManagement : IUserManagement
    {
        public void UploadNewPics(IEnumerable<string> imageUrls)
        {

            using (var ctx = new Context())
            {

                foreach (var imageUrl in imageUrls)
                {
                    //save to data base
                    .
                    .
                    .
                }

                try
                {
                    ctx.SaveChanges();
                }
                catch (Exception e)
                {
                    throw;
                }
            }
        }
    }



        public class UserApiController : ApiController
{
    [HttpPost]
    public async Task<IHttpActionResult> UploadNewPics()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        var root = HttpContext.Current.Server.MapPath("~/Resources/Users/");
        var provider = new CustomMultipartFormDataStreamProvider(root);
        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            IUserManagement userManagement = new UserManagement();

            var imageUrls = provider.FileData.Select(x=> Path.GetFileName(x.LocalFileName));
            //userManagement.UploadUserImage(uploadImageJson, Path.GetFileName(imageFile.LocalFileName), (long)imageFile.Headers.ContentLength);
            userManagement.UploadNewPics(imageUrls);
        }
        catch (Exception e)
        {
            return InternalServerError();
        }
        return Ok();
    }
}
// Multipart request, upload file...
        Drawable drawable = ContextCompat.getDrawable(mContext, R.drawable.ic_launcher);
        if (drawable != null) {
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream);
            final byte[] bitmapdata = stream.toByteArray();

            OkHttpClient client = new OkHttpClient();
            RequestBody requestBody = new MultipartBuilder()
                    .type(MultipartBuilder.FORM)
                    .addPart(
                            Headers.of("Content-Disposition", "form-data; name=\"title\""),
                            RequestBody.create(null, "Sample Text Content"))
                    .addPart(
                            Headers.of("Content-Disposition", "form-data; name=\"file\"; filename=\"ic_launcher.png\""),
                            RequestBody.create(MEDIA_TYPE_PNG, bitmapdata))
                    .build();
            final Request request = new Request.Builder()
                    .url("http://192.168.1.100:20583/fileupload")
                    .post(requestBody)
                    .build();

            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(final Request request, final IOException e) {
                    Log.e(LOG_TAG, e.toString());
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(mContext, e.toString(), Toast.LENGTH_SHORT).show();
                            mTextView.setText(e.toString());
                        }
                    });
                }

                @Override
                public void onResponse(Response response) throws IOException {
                    final String message = response.toString();
                    Log.i(LOG_TAG, message);
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
                            mTextView.setText(message);
                        }
                    });
                }
            });
        }