使用http POST方法将文件从android上传到ASP .net

时间:2016-02-24 07:55:58

标签: java android asp.net file

我需要使用webservice将我的文件android设备上传到服务器。但不幸的是,我在做这件事时遇到了错误。请帮我清除这个错误。

这是我的java代码:

         public class HttpFileUpload implements Runnable {
         URL connectURL;
        String responseString;
         String Title;
String Description;
byte[ ] dataToServer;
FileInputStream fileInputStream = null;

HttpFileUpload(String urlString, String vTitle, String vDesc){
    try{
        connectURL = new URL(urlString);
        Title= vTitle;
        Description = vDesc;
    }catch(Exception ex){
        Log.i("HttpFileUpload","URL Malformatted");
    }
}

void Send_Now(FileInputStream fStream){
    fileInputStream = fStream;
    Sending();
}

void Sending(){
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    String iFileName = "ovicam_temp_vid.mp4";
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    String Tag="fSnd";
    try
    {
        Log.e(Tag,"Starting Http File Sending to URL");

        // Open a HTTP connection to the URL
        HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection();

        // Allow Inputs
        conn.setDoInput(true);

        // Allow Outputs
        conn.setDoOutput(true);

        // Don't use a cached copy.
        conn.setUseCaches(false);

        // Use a post method.
        conn.setRequestMethod("POST");

        conn.setRequestProperty("Connection", "Keep-Alive");

        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);

        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"title\""+ lineEnd);
        dos.writeBytes(lineEnd);
        dos.writeBytes(Title);
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + lineEnd);

        dos.writeBytes("Content-Disposition: form-data; name=\"description\""+ lineEnd);
        dos.writeBytes(lineEnd);
        dos.writeBytes(Description);
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + lineEnd);

        dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + iFileName +"\"" + lineEnd);
        dos.writeBytes(lineEnd);

        Log.e(Tag,"Headers are written");

        // create a buffer of maximum size
        int bytesAvailable = fileInputStream.available();

        int maxBufferSize = 1024;
        int bufferSize = Math.min(bytesAvailable, maxBufferSize);
        byte[ ] buffer = new byte[bufferSize];

        // read file and write it into form...
        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        while (bytesRead > 0)
        {
            dos.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable,maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0,bufferSize);
        }
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // close streams
        fileInputStream.close();

        dos.flush();

        Log.e(Tag,"File Sent, Response: "+String.valueOf(conn.getResponseCode()));

        InputStream is = conn.getInputStream();

        // retrieve the response from server
        int ch;

        StringBuffer b =new StringBuffer();
        while( ( ch = is.read() ) != -1 ){ b.append( (char)ch ); }
        String s=b.toString();
        Log.i("Response",s);
        dos.close();
    }
    catch (MalformedURLException ex)
    {
        Log.e(Tag, "URL error: " + ex.getMessage(), ex);
    }

    catch (IOException ioe)
    {

        ioe.printStackTrace();
        Log.e(Tag, "IO error: " + ioe.getMessage(), ioe);
    }
}

@Override
public void run() {
    // TODO Auto-generated method stub
}

}

logcat的:

java.io.FileNotFoundException: http:///****8*******8/*****
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:210)
            at arun.com.test.HttpFileUpload.Sending(HttpFileUpload.java:118)
            at arun.com.test.HttpFileUpload.Send_Now(HttpFileUpload.java:36)

1 个答案:

答案 0 :(得分:0)

普通的REST网络服务不会在POST / PUT上返回响应主体,只需response status。你想确定它而不是身体。

替换

InputStream response = conn.getInputStream();

通过

int status = conn.getResponseCode();

HTTP规范中提供了所有可用的状态代码及其含义,如之前链接的那样。 Web服务本身也应该附带一些文档,概述Web服务支持的所有状态代码及其特殊含义(如果有的话)。

如果状态以4nn5nn开头,则您希望使用getErrorStream()来阅读可能包含错误详情的回复正文。

InputStream error = con.getErrorStream();

取自this answer