@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);
  }
Пример #2
0
    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();
    }
Пример #3
0
  /**
   * 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);
  }
Пример #4
0
  /**
   * 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()));
          }
        });
  }
Пример #5
0
 /**
  * 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();
 }
Пример #6
0
  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);
    }
  }
Пример #7
0
  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());
              }
            });
  }
Пример #8
0
  @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);
                        }
                      });
                }
              });
    }
  }