php - 我如何使用改造上传多个文件

标签 php android retrofit2

如何使用 retrofit 上传多个文件? ,

我尝试使用此代码上传文件:

API服务:

@Multipart
@POST("uploadData.php")
Call<ServerResponse> uploadFile(@Part MultipartBody.Part file,
                                @Part("name") RequestBody name,
                                @Part MultipartBody.Part img,
                                @Part("imgname") RequestBody imgname);

和上传方法:

private void uploadFile() {
    File file = new File(Environment.getExternalStorageDirectory() + "/Download/audio2.wav");
    File file2 = new File(Environment.getExternalStorageDirectory() + "/Download/Salty.png");

    RequestBody mFile = RequestBody.create(MediaType.parse("audio/*"), file);
    MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), mFile);
    RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), file.getName());

    RequestBody mFile2 = RequestBody.create(MediaType.parse("image/*"), file2);
    MultipartBody.Part fileToUpload2 = MultipartBody.Part.createFormData("file", file2.getName(), mFile2);
    RequestBody filename2 = RequestBody.create(MediaType.parse("text/plain"), file2.getName());

    ApiService uploadImage = ApiClient.getClient().create(ApiService.class);
    Call<ServerResponse> fileUpload = uploadImage.uploadFile(fileToUpload, filename, fileToUpload2, filename2);
    fileUpload.enqueue(new Callback<ServerResponse>() {
            @Override
            public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
                Toast.makeText(MainActivity.this, "Success " + response.message(), Toast.LENGTH_LONG).show();
                Toast.makeText(MainActivity.this, "Success " + response.body().toString(), Toast.LENGTH_LONG).show();
            }

            @Override
            public void onFailure(Call<ServerResponse> call, Throwable t) {
                Log.d("TAG", "Error " + t.getMessage());
            }
    });
}

php代码:

$result = array("success" => $_FILES["file"]["name"]);
$file_path = basename($_FILES['file']['name']);

$imgResult = array("success" => $_FILES["img"]["imgname"]);
$img_path = basename($_FILES['img']['imgname']);


if (move_uploaded_file($_FILES['img']['tmp_name2'], "$img_path") or
        move_uploaded_file($_FILES['file']['tmp_name'], "$file_path")) {
    $result = array("success" => "File successfully uploaded");
} else {
    $result = array("success" => "error uploading file");
}

echo json_encode($result, JSON_PRETTY_PRINT);

此代码仅适用于一个文件,我不知道原因,

任何帮助, 提前致谢。

最佳答案

您必须更改代码,以便使用改造在单个请求中上传多个文件,如下所示。

创建一个创建 MultiPartBody.Part 的函数并将自动获取其类型扩展名。

public static MultipartBody.Part prepareFilePart(String partName, String fileUri) {
    File file = new File(fileUri);
    String mimeType= URLConnection.guessContentTypeFromName(file.getName());
    Log.e("mimeType",mimeType);
    //create RequestBody instance from file
    RequestBody requestFile = RequestBody.create(MediaType.parse(mimeType), file);
    //MultipartBody.Part is used to send also the actual file name
    return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}

现在在您的代码中,要上传多个文件,请创建 ArrayList<MultiPartBody.Part>如下所示。

public void uploadFile(){
    ArrayList<MultiPartBody.Part> files = new ArrayList<MultiPartBody.Part>();

    for(int i=0; i < selectedFiles.size; i++){
        files.add(prepareFilePart("file_"+(i+1), selectedFiles.get(i)));
        //Where selectedFiles is selected file URI list
    }

    RequestBody totalFiles = RequestBody.create(MediaType.parse("text/plain"), files.size);

    ApiService uploadImage = ApiClient.getClient().create(ApiService.class);
    Call<ServerResponse> fileUpload = uploadImage.uploadFile(files,totalFiles);
    fileUpload.enqueue(...);

}

在你的ApiService , 修改为

@Multipart
@POST("uploadData.php")
Call<ServerResponse> uploadFile(@Part ArrayLisy<MultipartBody.Part> files, @Part("totalFiles") RequestBody totalFiles);

在你的PHP文件将代码更改为

$totalFiles = $_REQUEST['totalFiles'];
$successUpload = 0;

for($i=1; $i <= $totalFiles; $i++){
    $fileName = 'file_'.$i;
    if(move_uploaded_file($_FILES[$fileName]['tmp_name'],"Valid_file_path"){
        $successUpload += 1;
    }
}

echo $successUpload.' Files uploaded successfully.';

关于php - 我如何使用改造上传多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671396/

相关文章:

php - mysql_query() 期望参数 1 为字符串

php - 很多选择请求

java - android studio ExpandableListAdapter 上下文错误

android - 有人可以解释一下 android 中的 Cursor 吗?

java - 如何将Jsonelement解析为Array?

php - 在金字塔结构中生成随机玩家优势 (PHP)

php - 使用mysqli将数据插入数据库时​​,出现SQL语法错误

c# - Xamarin.Android : Gravity parameter in DrawerLayout. 布局参数

java - Android 上的模拟 API 响应

android - OkHttp 客户端的最佳/不易出错的缓存大小是多少(与 exoplayer 一起使用)