Android дооснащение 2, выберите видео и загрузить на сервер - PullRequest
0 голосов
/ 29 августа 2018

Пытаюсь выучить андроид, у меня сейчас все нормально, не отлично. Пытаюсь расширить свой набор навыков.

Итак, я пытаюсь получить видео для загрузки на сервер с модификацией. Моя модификация работает с загрузкой EditText и т. Д. Я использую здесь тот же IP-адрес, что и там.
В коде камера работает отлично, записывает видео и переименовывает видео, я думаю, что выбранное видео работает нормально (не совсем уверен в этом, но открывается галерея, я выбираю видео, и оно не падает так ..., и PHP позволяет мне опубликовать видео с помощью post man. Но когда я нажимаю кнопку загрузки, происходит сбой. Я не уверен, что проблема заключается в получении реального пути, в коде модификации или, возможно, мой выбор файла не работает? Мне нужен лучший кодер, чтобы помочь мне здесь. Я искал оверкада в течение нескольких дней. Перепробовал несколько примеров. Просто не заставил его работать. Я не могу понять ошибку. Я попытался добавить несколько тостов, чтобы узнать, не получаю ли я ошибку, но я никогда не получаю тост. Просто сбой. Вот мой код. Я хотя бы пытаюсь, брось мне кость.

Slim / PHP index

  $app->post('/saveFile', function(Request $request, Response $response){

 $response = array();

if (isset($_POST['desc']) && ($_POST['ID']) && strlen($_POST['desc']) > 0 && 
$_FILES['image']['error'] === UPLOAD_ERR_OK) {

$upload = new uploads();

            $file = $_FILES['image']['tmp_name'];

            $desc = $_POST['desc'];
            $ID = $_POST['ID'];  

            if ($upload->saveFile($ID, $file, 
 getFileExtension($_FILES['image']['name']), $desc)) {
                $response['error'] = false;
                $response['message'] = 'File Uploaded Successfullly';
            }

         else {
            $response['error'] = true;
            $response['message'] = 'Required parameters are not available';
        }


        echo json_encode($response);

 } 
});

 function getFileExtension($file)
{
$path_parts = pathinfo($file);
return $path_parts['extension'];
}

uploads.php

 class uploads
{

 private $con;

 public function __construct()
 {
    require_once dirname(__FILE__) . '/DbConnect.php';

    $db = new DbConnect();
    $this->con = $db->connect();
}


public function saveFile($ID, $file, $extension, $desc)
{
    $name = round(microtime(true) * 1000) . '.' . $extension;
    $filedest = dirname(__FILE__) . UPLOAD_PATH . $name;
    move_uploaded_file($file, $filedest);

    $url = $server_ip = gethostbyname(gethostname());

    $stmt = $this->con->prepare("INSERT INTO images (ID, description, url) 
 VALUES (?, ?, ?)");
    $stmt->bind_param("sss", $ID, $desc, $name);
    if ($stmt->execute())
        return true;
else

    return false;
}


}

API интерфейс

@Multipart
@POST("saveFile")
Call<MyResponse> uploadImage(@Part MultipartBody.Part file, @Part("desc") 
RequestBody desc, @Field("ID") String ID);

мой класс занятий

 public class vidcam extends Activity implements View.OnClickListener {

 String ID, prepend;
 private final int VIDEO_REQUEST_CODE = 100;
 private final int REQUEST_TAKE_GALLERY_VIDEO =22;

 File video_file;

 Button RecordButton, tobaitana, viduploadbutton, uploadvideo;
 Uri selectedVideo;


 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_vidcam);

    RecordButton = (Button) findViewById(R.id.RecordButton);
    RecordButton.setOnClickListener(this);

    tobaitana = (Button) findViewById(R.id.tobaitana);
    tobaitana.setOnClickListener(this);

    viduploadbutton = (Button) findViewById(R.id.viduploadbutton);
    viduploadbutton.setOnClickListener(this);

    uploadvideo = (Button) findViewById(R.id.uploadvideo);
    uploadvideo.setOnClickListener(this);

 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent 
data) {

    if (requestCode == VIDEO_REQUEST_CODE){
        Toast.makeText(getApplicationContext(), "Video Saved", 
 Toast.LENGTH_LONG).show();
    }
    if (resultCode == RESULT_OK) {
        if(requestCode == REQUEST_TAKE_GALLERY_VIDEO){
            selectedVideo = data.getData();

 }}}

 public File getfilepath () throws IOException {

    File videofolder = new File("sdcard/video_app");
    if (!videofolder.exists())
    {
        videofolder.mkdir();
    }

    String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    prepend = "MOBILITY_" + timestamp + "_";
    video_file = File.createTempFile(prepend, ".mp4", videofolder);

    return video_file;
}

@Override
public void onClick(View view) {
    switch (view.getId()){

        case R.id.RecordButton:
            Intent video_intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
            File videolocation = null;
            try {
                videolocation = getfilepath();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Uri video_uri = Uri.fromFile(videolocation);
            video_intent.putExtra(MediaStore.EXTRA_OUTPUT, video_uri);
            video_intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
            startActivityForResult(video_intent, VIDEO_REQUEST_CODE);
            break;

        case R.id.tobaitana:
            Intent toanbait = new Intent(this, Abait.class);
            startActivity(toanbait);
            break;

        case R.id.viduploadbutton:
            Intent selectfile = new Intent(Intent.ACTION_PICK, MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(selectfile, REQUEST_TAKE_GALLERY_VIDEO);
            break;

        case R.id.uploadvideo:
            uploadFile(selectedVideo);
            break;
    }
}

public void useID() {
    SharedPreferences shareID = getSharedPreferences("shareID", Context.MODE_PRIVATE);
    ID = shareID.getString("ID", "");
}

private String getRealPathFromURI(Uri contentUri) {
   String filePath;
   Cursor cursor = getContentResolver().query(contentUri, null, null, null, null);
   if(cursor == null)
   {
       filePath = contentUri.getPath();
   }else {
       cursor.moveToFirst();
   int idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA);
   filePath = cursor.getString(idx);
   cursor.close();
       Toast.makeText(getApplicationContext(), "realpath toast" + filePath, Toast.LENGTH_LONG).show();

   }
   return filePath;
}

private void uploadFile(Uri selectedVideo) {
    useID();
    File vidfile = new File(getRealPathFromURI(selectedVideo));
    if (vidfile.exists()) {
    RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(selectedVideo)), vidfile);
    MultipartBody.Part file = MultipartBody.Part.createFormData("filename", vidfile.getName(), requestBody);
    RequestBody desc = RequestBody.create(MediaType.parse("text/plain"), vidfile.getName());

    Call<MyResponse> call = RetrofitClient.getInstance().getAPIService().uploadImage(file, desc, ID);

    call.enqueue(new Callback<MyResponse>() {
        @Override
        public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {

            if (!response.body().error) {
                Toast.makeText(getApplicationContext(), "File Uploaded Successfully...", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(getApplicationContext(), "Some error occurred...", Toast.LENGTH_LONG).show();
            }
        }
        @Override
        public void onFailure(Call<MyResponse> call, Throwable t) {
            Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
        }
    });
} else {Toast.makeText(getApplicationContext(), "no file exists...", Toast.LENGTH_LONG).show();
    }
 }
 }

1 Ответ

0 голосов
/ 29 августа 2018

Ваш метод контроллера неверен, вы должны использовать объекты Request / Response и затем возвращать модифицированный Response; Моя версия ближе к предполагаемому использованию, но она не идеальна, в основном потому, что у меня нет инструментов для Android.

Надеюсь, это поможет, больше информации здесь: Запрос Загруженные файлы HttpStatusCodes

    $app->post('/saveFile', function(\Slim\Http\Request $request, \Slim\Http\Response $response){

    $responseData = [];
    $responseCode = 400;

    /** @var \Psr\Http\Message\UploadedFileInterface[] $files */
    $files    = $request->getUploadedFiles();
    /** @var string[] $postData */
    $postData = $request->getParsedBody();

    if ( !empty($postData['desc']) && ($postData['ID']) && !empty($files)) {
        $upload = new uploads();

        // use this if you are only upload one file
        // otherwise loop though them all
        $file = reset($files);

        $desc = $postData['desc'];
        $ID   = $postData['ID'];

        // this means the file was uploaded ok
        if ( $file->getError() === UPLOAD_ERR_OK ) {
            if ( $upload->saveFile($ID, $file, $file->getClientMediaType(), $desc) ) {
                $responseData['error']   = false;
                $responseData['message'] = 'File Uploaded Successfully';

                $responseCode = 200;
            }

            else {
                $responseData['error']   = true;
                $responseData['message'] = 'Required parameters are not available';

                $responseCode = 406;
            }
        }
        else {
            $responseData['error']   = true;
            $responseData['message'] = 'File upload error: '. $file->getError();

            $responseCode = 409;
        }
    }

    return $response->withJson($responseData, $responseCode);
});

Загрузка изменений

class uploads
{

    private $con;

    public function __construct()
    {
        // you shouldn't need this if you  are using Slim
        // and you are doing require_once '/vendor/autoload.php' at the beginning of your 
        // index.php
        require_once dirname(__FILE__) . '/DbConnect.php';

        $db = new DbConnect();
        $this->con = $db->connect();
    }


    public function saveFile($ID, \Psr\Http\Message\UploadedFileInterface $file, $extension, $desc)
    {
        $name     = round(microtime(true) * 1000) . '.' . $extension;
        $filedest = dirname(__FILE__) . UPLOAD_PATH . $name;

        $file->moveTo($filedest);

        $url = $server_ip = gethostbyname(gethostname());

        $stmt = $this->con->prepare("INSERT INTO images (ID, description, url) VALUES (?, ?, ?)");
        $stmt->bind_param("sss", $ID, $desc, $name);

        return $stmt->execute();
    }
}
...