簡體   English   中英

使用okhttp multipart將圖像從Android上傳到服務器

[英]Uploading image from Android to server with okhttp multipart

這是我從照片庫獲取圖像的方法:

private void presentPhotoSelector() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, 0);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0 && resultCode == Activity.RESULT_OK && data != null) {
        mSelectedPhotoUri = data.getData();
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), mSelectedPhotoUri);
            photoCircleImageView.setImageBitmap(bitmap);
            photoCircleImageView.setVisibility(View.VISIBLE);
            selectPhotoButton.setVisibility(View.INVISIBLE);
            uploadImageToServer(mSelectedPhotoUri);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

這是我嘗試上傳的方法:

public class JSONResponse {
    boolean userUploadedProfileImage;
    User user;
}

private void uploadImageToServer(Uri selectedPhotoUri) {
    if (selectedPhotoUri == null) {
        Log.d(TAG, "uploadImageToServer: selectedPhotoUri is null");
        return;
    }
    if (!AuthService.getInstance(mContext).isLoggedIn()) {
        Log.d(TAG, "uploadImageToServer: User not logged in");
        return;
    }
    showLoading("Laster opp bilde...", "Vennligst vent mens prosess foregår");
    File file = new File(selectedPhotoUri.getPath());
    final MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpeg");
    OkHttpClient okHttpClient = new OkHttpClient();
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("file", "image.jpg",
                    RequestBody.create(MEDIA_TYPE_JPG, file))
            .build();
    Request request = new Request.Builder()
            .header("Authorization", "Bearer " + AuthService.getInstance(mContext).getToken())
            .url(Config.URL + "/api/user/upload-profile-image")
            .post(requestBody)
            .build();
    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, final IOException e) {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    hideLoading();
                }
            });
            Log.d(TAG, "onFailure: response failed: " + e.getLocalizedMessage());
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    hideLoading();
                }
            });
            String responseBodyString = response.body().string();
            Log.d(TAG, "onResponse: responseBodyString: " + responseBodyString);
            Gson gson = new Gson();
            SettingsFragment.JSONResponse jsonResponse = gson.fromJson(responseBodyString, SettingsFragment.JSONResponse.class);
            if (jsonResponse != null) {
                UserService.getInstance(mContext).setMyUser(jsonResponse.user);
                Log.d(TAG, "onResponse: jsonResponse.userUploadedProfileImage: " + jsonResponse.userUploadedProfileImage);
                Log.d(TAG, "onResponse: jsonResponse.user: " + jsonResponse.user.toString());
            }
        }
    });
}

這不起作用,加載程序永遠不會停止旋轉,並且在服務器端出現此錯誤: multipart: NextPart: client disconnected

但是,如果我將上面的代碼更改為:

File file = new File(selectedPhotoUri.getPath());

至:

String file = selectedPhotoUri.getPath();

然后請求成功,但是,當我嘗試在瀏覽器上打開圖像時,它顯示“圖像無法顯示,因為它包含錯誤”。 當我查看數據庫時,我可以看到它將其mime類型解釋為:application / octet-stream,而不是image / jpeg。

我被困住了,我不知道該怎么辦。

我現在在控制台上收到此錯誤: onFailure: response failed: /-1/1/content:/media/external/images/media/69/ORIGINAL/NONE/656735600 (No such file or directory)

如果有幫助,我可以在模擬器上運行它。

一種方法是:您必須將Bitmap轉換為Base64(String)並將該base64發送到服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM