Не получается отправить в POST запросе видео на сервер
Нужно отправить видео на сервер. Запрос отправляется, но видео не загружается. Уже не знаю в чем дело. Сервер не ограничивает в размере, так же он не "увидит" файл, но ответ отдает. Далее прилагаю код: MainActivity.class:
public class MainActivity extends AppCompatActivity {
public static final String IMAGE_DIRECTORY_NAME = "Android File Upload";
Button button;
ImageView imageView;
private Uri fileUri;
private String postPath;
public static final int REQUEST_PICK_VIDEO = 3;
public ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.preview);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent pickVideoIntent = new Intent(Intent.ACTION_GET_CONTENT);
pickVideoIntent.setType("video/*");
startActivityForResult(pickVideoIntent, REQUEST_PICK_VIDEO);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_PICK_VIDEO) {
if (data != null) {
Toast.makeText(this, "Video content URI: " + data.getData(),
Toast.LENGTH_LONG).show();
Uri video = data.getData();
uploadVideoToServer(video.getEncodedPath());
}
}
}
else if (resultCode != RESULT_CANCELED) {
Toast.makeText(this, "Sorry, there was an error!", Toast.LENGTH_LONG).show();
}
}
/**
* returning video
*/
protected void showpDialog() {
if (!pDialog.isShowing()) pDialog.show();
}
protected void hidepDialog() {
if (pDialog.isShowing()) pDialog.dismiss();
}
private void uploadVideoToServer(String pathToVideoFile){
File videoFile = new File(pathToVideoFile);
RequestBody videoBody = RequestBody.create(MediaType.parse("video/*"), videoFile);
MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https:***")
.addConverterFactory(GsonConverterFactory.create())
.build();
JsonPlaceHolderApi vInterface = retrofit.create(JsonPlaceHolderApi.class);
Call<RequestBody> serverCom = vInterface.upload(vFile);
serverCom.enqueue(new Callback<RequestBody>() {
@Override
public void onResponse(Call<RequestBody> call, Response<RequestBody> response) {
RequestBody result = response.body();
Log.d(TAG, "Result " + result);
}
@Override
public void onFailure(Call<RequestBody> call, Throwable t) {
Toast.makeText(MainActivity.this, "Sorry, ther", Toast.LENGTH_LONG).show();
}
});
}}
Interace:
public interface JsonPlaceHolderApi {
@Multipart
@POST("upload")
Call<RequestBody> upload(@Part MultipartBody.Part video);}
При исследовании проблемы, получила вот это сообщение:java.io.filenotfoundexception: /document/video%: open failed: ENOENT (No such file or directory)
Ответы (1 шт):
Автор решения: Aiti
→ Ссылка
Собственно после некоторых танцев с бубнами, мне удалось решить проблему. Далее прилагаю рабочий код.
public class MeasurementActivity extends AppCompatActivity {
Button button;
ImageView imageView;
public static final int MEDIA_TYPE_IMAGE = 1;
private Uri fileUri;
private String postPath;
public static final int REQUEST_PICK_VIDEO = 1;
public ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_measurement);
button = (Button) findViewById(R.id.button4);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent pickVideoIntent = new Intent(Intent.ACTION_GET_CONTENT);
pickVideoIntent.setType("video/*");
startActivityForResult(pickVideoIntent, REQUEST_PICK_VIDEO);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_PICK_VIDEO) {
if (data != null) {
Toast.makeText(this, "Video content URI: " + data.getData(),
Toast.LENGTH_LONG).show();
Uri video = data.getData();
uploadVideoToServer(video.getPath());
}
}
}
else if (resultCode != RESULT_CANCELED) {
Toast.makeText(this, "Sorry, there was an error!", Toast.LENGTH_LONG).show();
}
}
/**
* returning image / video
*/
protected void showpDialog() {
if (!pDialog.isShowing()) pDialog.show();
}
protected void hidepDialog() {
if (pDialog.isShowing()) pDialog.dismiss();
}
private void uploadVideoToServer(String pathToVideoFile){
File videoFile =
new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + pathToVideoFile);
RequestBody videoBody = RequestBody.create(MediaType.parse("video/*.mp4"), videoFile);
MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://")
.addConverterFactory(GsonConverterFactory.create())
.build();
GetData vInterface = retrofit.create(GetData.class);
Call<Post> serverCom = vInterface.upload(videoFile);
serverCom.enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response) {
response.code();
Toast.makeText(MeasurementActivity.this, "" + response.code(), Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Call<Post> call, Throwable t) {
Toast.makeText(MeasurementActivity.this, "Попробуйте снова." + t, Toast.LENGTH_LONG).show();
}
});
}}