Android改造2,选择视频并上传到服务器

问题描述 投票:0回答:1

我正在努力学习android,我现在很好,不是很好。试图扩展我的技能组合。

所以我试图通过改造将视频上传到服务器。我的改造工作上传EditText等。我在这里使用相同的IP地址。 在代码中相机工作精细录制视频并重命名视频,我相信选择视频工作正常(不完全确定,但画廊打开我选择一个视频,它不会崩溃所以......,PHP允许我使用post man发布视频。但是当我点击上传按钮崩溃时。我不确定问题是在获取真实路径,在改装代码中,还是我的文件选择不起作用?我需要一个更好的程序员可以帮我解决这个问题。我一直在寻找过多的问题。尝试了多个例子。只是没有让它发挥作用。我无法弄清楚错误。我试图在那里扔一些吐司,看看我是否得到了一个错误,但我没有得到祝酒。只是一个崩溃。这是我的代码。我至少在尝试,给我一个骨头。

Slim / PHP索引

  $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();
    }
 }
 }
android retrofit2 slim-3
1个回答
0
投票

你的控制器方法都错了,你必须使用Request / Response对象而不是返回修改后的Response;我的版本更接近预期用途,但它并不完美,主要是因为我没有Android工具。

我希望它有所帮助,更多信息在这里:Request UploadedFiles 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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.