首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在android参数为文件的情况下使用改装上传视频

在android参数为文件的情况下使用改装上传视频
EN

Stack Overflow用户
提问于 2017-02-21 04:12:22
回答 1查看 1.9K关注 0票数 0

我一直在学习各种教程,并试图使用android中的改装将视频上传到我的服务器。我需要的唯一参数如下图所示

我继续得到超时异常,即使我已经增加了超时。这是我上传的视频代码。

代码语言:javascript
运行
复制
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .readTimeout(60, TimeUnit.SECONDS)
            .connectTimeout(60, TimeUnit.SECONDS)
            .build();
    Log.v("test_get", "get the file");
    //MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody);
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://xxxx:xxx/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build();

    SmileVideoAPI service = retrofit.create(SmileVideoAPI.class);
    MediaType MEDIA_TYPE = MediaType.parse("video/mp4");
    File videoFile = new File(pathToVideoFile);
    RequestBody videoBody = RequestBody.create(MEDIA_TYPE, videoFile);
    Log.v("test_get", "before uploading");
    Call<ResponseBody> call = service.uploadVideo("desc", videoBody);
    Log.v("test_get", "after uploading");
    call.enqueue(new Callback<ResponseBody>(){
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful())
            {
                Log.i("mok","S");
                ResponseBody rb = response.body();
                Log.i("mok",rb.toString());
            }
            else {
                Log.i("mok", "F");
                ResponseBody rb = response.errorBody();
            }
        }
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            t.printStackTrace();
            Log.i("mok",t.getCause()+"");
            Log.i("mok","T");
            finish();
        } 
    });
    return msg;

    I have been trying taking reference from this post : 

upload video using Retrofit 2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-21 04:50:16

如果您希望上传文件(任何类型),这里有一种适用于Android的PHP方法,效果很好。

您需要服务器上的一个脚本来接收文件:

uploadfile.php

代码语言:javascript
运行
复制
<?php
$fname = $_POST['filename'];
$target_path = "/yourserverpath/".$fname;
$upload_path = $_FILES['uploadedfile']['tmp_name'];
If (move_uploaded_file($upload_path, $target_path)) {
    echo "Moved";
} else {
    echo "Not Moved";
}
?>

您可以在服务器上使用以下uploadfile.php测试器文件在浏览器上测试您的HTML:

Uploadfile.html:

代码语言:javascript
运行
复制
<form enctype="multipart/form-data" action="uploader.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose a file to upload: 
<input name="uploadedfile" type="file" /><br />
Filename on server:
<input name="filename" type="text" /><br />
<br />
<input type="submit" value="Upload File" />
</form>

一旦服务器端开始从浏览器上传文件,那么Android部分就非常简单了:

上传器处理文件的上传。该类调用服务器上的uploadfile.php脚本。

上传文件可能很棘手,但我们有一个秘密武器,使它更容易。我们将使用DefaultHttpClient,它允许我们访问MultipartEntity方法。当使用HttpUrlConnection时,此方法不可用。fileUpload类放置在AsyncTask中。我的示例中的selectedPicName只是您的文件名。postURL是前面提到的脚本的完整URL。

代码语言:javascript
运行
复制
private class fileUpload extends AsyncTask<Void, String, Void> {
    protected Void doInBackground(Void... unused) {
        // upload new picture to the server        
        String postURL = uploadFilesScript;
        File file = new File(path2, selectedPicName);
        // upload the new picture
        Uploader(postURL, file, selectedPicName);
    } 
}

Uploader类如下所示(请注意,“上载文件”名称必须与接收上传的PHP脚本中的变量匹配。)

代码语言:javascript
运行
复制
public static void Uploader(String postURL, File file, String fname) {
    try {
        DefaultHttpClient httpclient = new DefaultHttpClient();
        httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, 
                                            HttpVersion.HTTP_1_1);
        HttpPost httppost = new HttpPost(postURL);
        // the boundary key below is arbitrary,
        // it just needs to match the MPE so it can decode multipart correctly
        httppost.setHeader("Content-Type", "multipart/form-data; boundary=--32530126183148");
        MultipartEntity mpEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,
                                                       "--32530126183148", 
                                                       Charset.forName("UTF-8"));
            mpEntity.addPart("uploadedfile", new FileBody((file), "application/txt"));
            mpEntity.addPart("MAX_FILE_SIZE", new StringBody("100000"));
            mpEntity.addPart("filename", new StringBody(fname));
        }
        httppost.setEntity(mpEntity);
        HttpResponse response;
        response = httpclient.execute(httppost);
        HttpEntity resEntity = response.getEntity();
          if (resEntity != null) {
                resEntity.consumeContent();
                Log.v("UPLOAD", "resEntity=" + resEntity.toString());
            }
        httpclient.getConnectionManager().shutdown();
    } catch (Throwable e) {
    }
}

MultipartEntity允许我们使用addPart方法简单地指定文件名和文件内容。在下面的示例中,变量名与服务器上接收PHP脚本所期望的名称匹配。

如果我们必须使用HttpUrlConnection类来完成上传功能,这将非常复杂,因为我们必须创建自己的文件处理包装器。MultipartEntity还允许我们指定字符集和最大文件大小。需要提供唯一但任意的边界字符串,该字符串必须与服务器脚本匹配。

我一直在我的生产应用程序中使用这种方法,而且效果很好。

充分披露-我写了一本书,名为安卓软件开发:一个实用项目的集合和上传在服务器旋转应用程序在第5章,但这应该是你所需要的上传视频。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42358548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档