【问题标题】:Android image Upload problemAndroid图片上传问题
【发布时间】:2011-07-02 10:05:16
【问题描述】:

您好,我想将图像从 android 模拟器上传到 asp.net 服务器。下面的代码可以与服务器通信。当我尝试创建一个文本文件以查看从 android 发送的数据是否成功时。但是没有文件数据没有发送到服务器。我尝试将纯文本发送到服务器,但我在服务器上创建的文件没有打印文本。

这里的代码: HttpURLConnection conn = null;

    String boundary = "==============";

        try
        {   
            String disposition = "Content-Disposition: form-data; name=\"userfile\"; filename=\"" + filename + ".jpg\"";
            String contentType = "Content-Type: application/octet-stream";

            String t1   = "Content-Disposition: form-data; name=\"test\";";
            String t2 = "Content-Type: text/plain";

            // This is the standard format for a multipart request
            StringBuffer requestBody = new StringBuffer();
            /*
            requestBody.append("--"+boundary);
            requestBody.append('\n');
            requestBody.append(disposition);
            requestBody.append('\n');
            requestBody.append(contentType);
            requestBody.append('\n');
            requestBody.append('\n');
            requestBody.append(new String(getByteFromStream(stream)));
            */

            requestBody.append('\n');
            requestBody.append('\n');
            requestBody.append("--"+boundary);
            requestBody.append('\n');
            requestBody.append(t1);
            requestBody.append('\n');
            requestBody.append(t2);
            requestBody.append('\n');
            requestBody.append('\n');
            requestBody.append("basdfsdafsadfsad");
            requestBody.append("--"+boundary+"--");

            // Make a connect to the server
            URL url = new URL(targetURL);
            conn = (HttpURLConnection) url.openConnection();

            // Put the authentication details in the request
           /*
             if (username != null) {

                String usernamePassword = username + ":" + password;
                String encodedUsernamePassword = Base64.encodeBytes(usernamePassword.getBytes());
                conn.setRequestProperty ("Authorization", "Basic " + encodedUsernamePassword);
            }
            */
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("MIME-Version:", "1.0");
            conn.setRequestProperty("Content-Type", "multipart/mixed; boundary=" + boundary);

            // Send the body
            DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
            dataOS.writeBytes(requestBody.toString());
            dataOS.flush();
            dataOS.close();

            // Ensure we got the HTTP 200 response code
            int responseCode = conn.getResponseCode();
            if (responseCode != 200) {
                throw new Exception(String.format("Received the response code %d from the URL %s", responseCode, url));
            }

我的请求正文布局不正确吗?

【问题讨论】:

  • 如果可能的话,你为什么不在你的服务器中查看原始请求?
  • 请教我如何查看服务器上的原始数据

标签: android image upload


【解决方案1】:

我使用 asp.net 作为文件处理程序。下面是用于上传文件的事件的简单 Android 代码

    String pathToOurFile = "/mnt/sdcard/sysdroid.png";//this will be the file path        String urlServer = "http://yourdomain/fileupload.aspx";
int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1*1024*1024;

    try
    {
    FileInputStream fileInputStream = new FileInputStream(new File(pathToOurFile) );

    URL url = new URL(urlServer);
    connection = (HttpURLConnection) url.openConnection();

    // Allow Inputs & Outputs
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);

    // Enable POST method
    connection.setRequestMethod("POST");

    connection.setRequestProperty("Connection", "Keep-Alive");
    connection.setRequestProperty("Content-Type",  "multipart/form-data");
    connection.setRequestProperty("SD-FileName", "sysdroid.png");//This will be the file name

    outputStream = new DataOutputStream( connection.getOutputStream() );
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    buffer = new byte[bufferSize];

    // Read file
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    while (bytesRead > 0)
    {
        outputStream.write(buffer, 0, bufferSize);
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    }

     int serverResponseCode = connection.getResponseCode();
     String serverResponseMessage = connection.getResponseMessage();
     Log.d("ServerCode",""+serverResponseCode);
     Log.d("serverResponseMessage",""+serverResponseMessage);
    fileInputStream.close();
    outputStream.flush();
    outputStream.close();


}
    catch (Exception ex)
    {
        //ex.printStackTrace();
        Log.e("Error: ", ex.getMessage());
    }

到目前为止一切顺利。让我们看看 asp.net 代码。为此,我使用了简单的“Web 表单”。后面的代码是

protected void Page_Load(object sender, EventArgs e)
{
    string uploadDir = Server.MapPath("~/images");
    string imgPath = Path.Combine(uploadDir, Request.Headers["SD-FileName"]);

    try{          
        byte[]bytes = new byte[Request.InputStream.Length];
        Request.InputStream.Read(bytes, 0, bytes.Length);
        System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
        Bitmap btMap = (Bitmap)System.Drawing.Image.FromStream(ms);
        btMap.Save(imgPath, ImageFormat.Jpeg);
        ms.Close();
    }
    catch (Exception exp)
    {            
        Response.Write(exp.Message);
    }     
}

希望这会奏效,并且您了解 Android 的 SD 卡和 asp.net 文件夹的读/写权限。

干杯 法哈尔

【讨论】:

    【解决方案2】:

    因为你上传了两个文件,所以你应该看到最后一个格式。祝你好运。 6. 例子

    假设服务器提供以下 HTML:

     <FORM ACTION="http://server.dom/cgi/handle"
           ENCTYPE="multipart/form-data"
           METHOD=POST>
     What is your name? <INPUT TYPE=TEXT NAME=submitter>
     What files are you sending? <INPUT TYPE=FILE NAME=pics>
     </FORM>
    

    并且用户在名称字段中键入“Joe Blow”,然后选择一个文本 文件“file1.txt”以回答“您要发送哪些文件?”

    客户端可能会发回以下数据:

        Content-type: multipart/form-data, boundary=AaB03x
    
        --AaB03x
        content-disposition: form-data; name="field1"
    
        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"; filename="file1.txt"
        Content-Type: text/plain
    
         ... contents of file1.txt ...
        --AaB03x--
    

    如果用户还指定了图像文件“file2.gif”作为答案 到“你发送什么文件?”,客户端可能客户端可能发送 返回以下数据:

        Content-type: multipart/form-data, boundary=AaB03x
    
        --AaB03x
        content-disposition: form-data; name="field1"
    
        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"
        Content-type: multipart/mixed, boundary=BbC04y
    
        --BbC04y
        Content-disposition: attachment; filename="file1.txt"
        Content-Type: text/plain
    
        ... contents of file1.txt ...
        --BbC04y
        Content-disposition: attachment; filename="file2.gif"
        Content-type: image/gif
        Content-Transfer-Encoding: binary
    
          ...contents of file2.gif...
        --BbC04y--
        --AaB03x--
    

    Form-based File Upload in HTML

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2019-02-03
      • 2011-04-23
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多