当前位置: 首页 > 知识库问答 >
问题:

Android将gif文件上载到.NET web API时出现内部服务器错误

锺离伟彦
2023-03-14

我测试了.NET web API,postman正在工作,但我尝试在Android中使用okhttp3和retrofit2。我都收到了内部服务器错误500。怎么了?我该怎么办?

分级

实现“com.squareup.okhttp3:okhttp:3.4.1”

实现“com.squareup.okhttp3:logging-interceptor:3.4.1”

实现“com.squareup.reverfit2:reverfit:2.3.0”

实现“com.squareup.reverfit2:converter-gson:2.1.0”

Android改版(点击按钮时调用uploadFile方法)

 public interface UploadAPIs {
    @Multipart
    @POST("FileUpload")
    Call<ResponseBody> uploadFile(
            @Part ("description") RequestBody description,
            @Part MultipartBody.Part file);
}

public Boolean uploadFile(File file) {
RequestBody descriptionPart = RequestBody.create(MultipartBody.FORM, file.getName());

RequestBody filePart = RequestBody.create(MediaType.parse("image/gif"), file);
MultipartBody.Part fileMulti = MultipartBody.Part.createFormData("file"
, file.getName(), filePart);

Retrofit.Builder builder = new Retrofit.Builder()
        .baseUrl("http://xxxxxxxxxx/api/FileExplorerApi/")
        .addConverterFactory(GsonConverterFactory.create());

Retrofit retrofit = builder.build();

UploadAPIs uploadAPIs = retrofit.create(UploadAPIs.class);

Call<ResponseBody> call = uploadAPIs.uploadFile(descriptionPart, fileMulti);
call.enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) {
        if (!response.isSuccessful()) {
            // Handle the error
            String error = response.errorBody().toString();
            return false;
        }else{
            String responseStr = response.body().toString();
            return true;
        }
    }
    @Override
    public void onFailure(Call call, Throwable t) {
    }
});
}

Android okhttp3(点击按钮时调用uploadFile方法)

public Boolean uploadFile(File file) {  
    OkHttpClient client = new OkHttpClient();
    RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
            .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file))
            .build();

    Request request = new Request.Builder()
            .url("http://xxxxxxxxxx/api/FileExplorerApi/FileUpload")
            .post(body)
            .addHeader("content-type", "multipart/form-data")
            .addHeader("Content-Type", "multipart/form-data,image/gif")
            .addHeader("cache-control", "no-cache")
            .addHeader("Postman-Token", "58564c84-b8a7-4455-b346-4606ce696675")
            .build();

    client.newCall(request).enqueue(new Callback() {

        @Override
        public void onFailure(final Call call, final IOException e) {
            // Handle the error
        }

        @Override
        public void onResponse(final Call call, final Response response) throws IOException {
            if (!response.isSuccessful()) {
                // Handle the error
                return false;
            }else{
                String responseStr = response.body().string();
                return true;
            }
            // Upload successful
        }
    });
}

.NET Web Api(Web Apihtml" target="_blank">控制器)

[HttpPost]
[Route("~/FileExplorerApi/FileUpload")]        
public HttpResponseMessage Upload()
{

    var request = HttpContext.Current.Request;            
    var file = request.Files["file"];

    string filename = DateTime.Now.ToString("yyyyMMddHHmmssFFF_") + file.FileName;

    file.SaveAs(@"c:\Projects\FileExplorer\Gif\" + filename);

    return new HttpResponseMessage(HttpStatusCode.OK);
}

共有1个答案

长孙嘉容
2023-03-14

终于有了答案。我的.NET项目是MVC现有的web项目。我在项目中添加了API控制器,这就是为什么我会遇到这个问题的原因。我想邮递员的结果是好的,安卓也应该是好的。我的解决方案是创建新的仅.NET web API项目。以下答案只是为了我的改进而分享。
我更改了新的HTTP客户端loopj库,使其比以前的两个库都更容易。

RequestParams params = new RequestParams();

try {
    params.put("file", file);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
AsyncHttpClient client = new AsyncHttpClient();
client.post("http://xxxxxxxxxx/api/FileExplorerApi/Upload?sub=Boomerang", params, new AsyncHttpResponseHandler() {

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
        System.out.println("statusCode "+statusCode);//statusCode 200
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

    }
});

我将上传一个很大的文件,为什么我需要在.NET MVC web API项目进行配置。上载升级文件需要执行以下配置。(web.config)

<system.web>    
    <httpRuntime maxRequestLength="2097152"/>    
</system.web>
<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824"/>
      </requestFiltering>
    </security>
<system.webServer>
 类似资料:
  • 我在Localhost中正确上传我的文件,但是当我在服务器上上传我的应用程序时,他们给我错误:上传文件后服务器错误。 这是我的控制器: 在我的本地主机中,文件保存在公用文件夹中。我想用public\u html或public\u html/image将我的文件保存在我的服务中。

  • 我正在尝试上载一个csv文件到服务器。下面是我的HTML代码: 还有我的JS:- 我面临以下错误:- 加载资源失败:服务器响应的状态为500(HTTP/1.1 500) 可能未经处理的拒绝:{“data”:{“timestamp”:1510643953084,“status”:500,“error”:“内部服务器错误”,“exception”:“java.lang.NullPointerExcep

  • 当我在git中切换分支并使用安装包时,我的本地AEM实例突然停止工作。 生成失败,请求执行 我的错误日志显示以下错误:

  • 我正在尝试通过Multer将文件上载到服务器。这段代码所做的只是创建文件夹,而不是文件。我还尝试使用github上的教程,但在前端我的代码也没有成功 代码AJAX 还有MAIN.JS 我从前端获得的console.log输出:

  • 问题内容: 我想使用 在请求之间保存一个ID ,但是执行请求时得到了结果。 我设计了一个简单的Flask应用程序原型来演示我的问题: 为什么执行请求时不能使用以下值存储cookie? 问题答案: 根据Flask会议文档: …这意味着用户可以查看你Cookie的内容,但不能修改它,除非他们知道用于签名的密钥。 为了使用会话,你必须设置一个秘密密钥。 设置密钥。并且你应该返回字符串,而不是int。

  • 尝试将文件上载到S3 Bucket,我使用以下代码设置SDK: 错误日志 可能的错误: URL应基于以下表单:文档