@Override public void post( String url, RequestParams params, Net.Parser<T> parser, Net.Callback<T> callback, Object tag) { MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM); // 添加普通的参数 LinkedHashMap<String, String> map = params.get(); for (Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext(); ) { String key = iterator.next(); builder.addPart( Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""), RequestBody.create(null, map.get(key))); } // 添加文件参数 LinkedHashMap<String, File> files = params.files(); for (Iterator<String> iterator = files.keySet().iterator(); iterator.hasNext(); ) { String key = iterator.next(); File file = files.get(key); builder.addPart( Headers.of( "Content-Disposition", "form-data; name=\"" + key + "\";filename=\"" + file.getName() + "\""), RequestBody.create(MediaType.parse("application/octet-stream"), file)); } // 组装Request Request request = new Request.Builder().url(url).post(builder.build()).build(); call(request, parser, callback, tag); }
private Request buildMultipartFormRequest( String url, File[] files, String[] fileKeys, Param[] params) { params = validateParam(params); MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM); for (Param param : params) { builder.addPart( Headers.of("Content-Disposition", "form-data; name=\"" + param.key + "\""), RequestBody.create(null, param.value)); } if (files != null) { RequestBody fileBody = null; for (int i = 0; i < files.length; i++) { File file = files[i]; String fileName = file.getName(); fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file); // TODO 根据文件名设置contentType builder.addPart( Headers.of( "Content-Disposition", "form-data; name=\"" + fileKeys[i] + "\"; filename=\"" + fileName + "\""), fileBody); } } RequestBody requestBody = builder.build(); return new Request.Builder().url(url).post(requestBody).build(); }
/** * Converts a document and returns an {@link InputStream}. * * @param document The file to convert * @param mediaType Internet media type of the file * @param conversionTarget The conversion target to use * @param customConfig The additional config params to use * @return Converted document in the specified format * @see {@link HttpMediaType} for available media types */ private InputStream convertDocument( final File document, final String mediaType, final ConversionTarget conversionTarget, final JsonObject customConfig) { if (document == null || !document.exists()) throw new IllegalArgumentException("document cannot be null and must exist"); if (customConfig == null) throw new NullPointerException("custom config must not be null"); final String type = mediaType != null ? mediaType : ConversionUtils.getMediaTypeFromFile(document); if (type == null) { throw new RuntimeException("mediaType cannot be null or empty"); } else if (!ConversionUtils.isValidMediaType(type)) { throw new IllegalArgumentException("file with the given media type is not supported"); } final JsonObject configJson = new JsonObject(); // Do this since we shouldn't mutate customConfig for (Map.Entry<String, JsonElement> entry : customConfig.entrySet()) { configJson.add(entry.getKey(), entry.getValue()); } // Add or override the conversion target configJson.addProperty(CONVERSION_TARGET, conversionTarget.toString()); final MediaType mType = MediaType.parse(type); final RequestBody body = new MultipartBuilder() .type(MultipartBuilder.FORM) .addPart( Headers.of(HttpHeaders.CONTENT_DISPOSITION, "form-data; name=\"config\""), RequestBody.create(HttpMediaType.JSON, configJson.toString())) .addPart( Headers.of(HttpHeaders.CONTENT_DISPOSITION, "form-data; name=\"file\""), RequestBody.create(mType, document)) .build(); final Request request = RequestBuilder.post(CONVERT_DOCUMENT_PATH) .withQuery(VERSION, versionDate) .withBody(body) .build(); final Response response = execute(request); return ResponseUtil.getInputStream(response); }
/** * Uploads the image to the server * * @param b * @param listener */ public void uploadImage(final Bitmap b, final OnResponseListener listener) { OkHttpClient httpClient = new OkHttpClient(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); // encode image as PNG, re-encoding as JPG may cause compression artefacts to be visible b.compress(Bitmap.CompressFormat.PNG, 0, bos); RequestBody requestBody = new MultipartBuilder() .type(MultipartBuilder.FORM) .addPart( // the filename parameter is needed to specify that this is indeed a file and not an // inline // attachment Headers.of( "Content-Disposition", "form-data; name=\"image\"; filename=\"image.png\""), RequestBody.create(MediaType.parse("image/png"), bos.toByteArray())) .build(); Request request = new Request.Builder().url(UPLOAD_ENDPOINT).post(requestBody).build(); Call call = httpClient.newCall(request); call.enqueue( new Callback() { @Override public void onFailure(Request request, IOException e) {} @Override public void onResponse(Response response) throws IOException { listener.onResponse(new ServerResponse(response.code(), response.body().string())); } }); }
/** * Build a multipart (file uploading) request body with the given form parameters, which could * contain text fields and file fields. * * @param formParams Form parameters in the form of Map * @return RequestBody */ public RequestBody buildRequestBodyMultipart(Map<String, Object> formParams) { MultipartBuilder mpBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); for (Entry<String, Object> param : formParams.entrySet()) { if (param.getValue() instanceof File) { File file = (File) param.getValue(); Headers partHeaders = Headers.of( "Content-Disposition", "form-data; name=\"" + param.getKey() + "\"; filename=\"" + file.getName() + "\""); MediaType mediaType = MediaType.parse(guessContentTypeFromFile(file)); mpBuilder.addPart(partHeaders, RequestBody.create(mediaType, file)); } else { Headers partHeaders = Headers.of("Content-Disposition", "form-data; name=\"" + param.getKey() + "\""); mpBuilder.addPart( partHeaders, RequestBody.create(null, parameterToString(param.getValue()))); } } return mpBuilder.build(); }
private void uploadPhoto( @Nullable String title, @Nullable String description, @NonNull String filePath) { final File file = new File(filePath); if (!FileUtil.isFileValid(file)) { LogUtil.w(TAG, "File is invalid, bailing"); return; } LogUtil.v(TAG, "Received File to upload"); ApiClient client = new ApiClient(Endpoints.UPLOAD.getUrl(), ApiClient.HttpRequest.POST); MediaType type; if (file.getAbsolutePath().endsWith("png")) { type = MediaType.parse("image/png"); } else if (file.getAbsolutePath().endsWith("gif")) { type = MediaType.parse("image/gif"); } else { type = MediaType.parse("image/jpeg"); } MultipartBuilder builder = new MultipartBuilder() .type(MultipartBuilder.FORM) .addPart( Headers.of("Content-Disposition", "form-data; name=\"image\""), new ProgressRequestBody(file, type, this)); builder.addPart( Headers.of("Content-Disposition", "form-data; name=\"type\""), RequestBody.create(null, "file")); if (!TextUtils.isEmpty(title)) { builder.addPart( Headers.of("Content-Disposition", "form-data; name=\"title\""), RequestBody.create(null, title)); } if (!TextUtils.isEmpty(description)) { builder.addPart( Headers.of("Content-Disposition", "form-data; name=\"description\""), RequestBody.create(null, description)); } RequestBody body = builder.build(); try { if (mNotificationId <= 0) mNotificationId = file.hashCode(); onUploadStarted(); JSONObject json = client.doWork(body); int status = json.getInt(ApiClient.KEY_STATUS); if (status == ApiClient.STATUS_OK) { handleResponse(json.getJSONObject(ApiClient.KEY_DATA)); } else { onUploadFailed(title, description, filePath, true); } } catch (IOException | JSONException e) { LogUtil.e(TAG, "Error uploading file", e); onUploadFailed(title, description, filePath, true); } }
private void upload() { File file = new File("/sdcard/1.doc"); // 此文件必须在手机上存在,实际情况下请自行修改,这个目录下的文件只是在我手机中存在。 // 这个是非ui线程回调,不可直接操作UI final ProgressListener progressListener = new ProgressListener() { @Override public void onProgress(long bytesWrite, long contentLength, boolean done) { Log.e("TAG", "bytesWrite:" + bytesWrite); Log.e("TAG", "contentLength" + contentLength); Log.e("TAG", (100 * bytesWrite) / contentLength + " % done "); Log.e("TAG", "done:" + done); Log.e("TAG", "================================"); } }; // 这个是ui线程回调,可直接操作UI final UIProgressListener uiProgressRequestListener = new UIProgressListener() { @Override public void onUIProgress(long bytesWrite, long contentLength, boolean done) { Log.e("TAG", "bytesWrite:" + bytesWrite); Log.e("TAG", "contentLength" + contentLength); Log.e("TAG", (100 * bytesWrite) / contentLength + " % done "); Log.e("TAG", "done:" + done); Log.e("TAG", "================================"); // ui层回调 uploadProgress.setProgress((int) ((100 * bytesWrite) / contentLength)); // Toast.makeText(getApplicationContext(), bytesWrite + " " + contentLength + " " + // done, Toast.LENGTH_LONG).show(); } @Override public void onUIStart(long bytesWrite, long contentLength, boolean done) { super.onUIStart(bytesWrite, contentLength, done); Toast.makeText(getApplicationContext(), "start", Toast.LENGTH_SHORT).show(); } @Override public void onUIFinish(long bytesWrite, long contentLength, boolean done) { super.onUIFinish(bytesWrite, contentLength, done); Toast.makeText(getApplicationContext(), "end", Toast.LENGTH_SHORT).show(); } }; // 构造上传请求,类似web表单 RequestBody requestBody = new MultipartBuilder() .type(MultipartBuilder.FORM) .addFormDataPart("hello", "android") .addFormDataPart("photo", file.getName(), RequestBody.create(null, file)) .addPart( Headers.of( "Content-Disposition", "form-data; name=\"another\";filename=\"another.dex\""), RequestBody.create(MediaType.parse("application/octet-stream"), file)) .build(); // 进行包装,使其支持进度回调 final Request request = new Request.Builder() .url("http://121.41.119.107:81/test/result.php") .post(ProgressHelper.addProgressRequestListener(requestBody, uiProgressRequestListener)) .build(); // 开始请求 client .newCall(request) .enqueue( new Callback() { @Override public void onFailure(Request request, IOException e) { Log.e("TAG", "error ", e); } @Override public void onResponse(Response response) throws IOException { Log.e("TAG", response.body().string()); } }); }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.textView); mHandler = new Handler(Looper.getMainLooper()); // 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); } }); } }); } }