我在 Android 中上传图像时遇到问题。

我正在使用 apache httpmime 4.1 lib 代码是这样的:

MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
 
reqEntity.addPart("image", new FileBody(new File(AndorraApplication.getPhotosPath() + "/" + entity.getFileName()), "image/jpeg")); 
resp = NetworkUtils.sendHttpRequestMultipart(EXPORT_PHOTOS_URI, reqEntity); 

NetworkUtils 类:

public class NetworkUtils { 
    public static final int REGISTRATION_TIMEOUT = 3 * 1000;  
    public static final int WAIT_TIMEOUT = 5 * 1000; 
 
    public static HttpResponse sendHttpRequestMultipart(String uri, MultipartEntity entity) { 
        HttpClient mHttpClient = new DefaultHttpClient(); 
        final HttpParams params = mHttpClient.getParams(); 
        HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT); 
        HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT); 
        ConnManagerParams.setTimeout(params, WAIT_TIMEOUT); 
 
        HttpPost post = new HttpPost(uri); 
        post.addHeader(entity.getContentType()); 
        post.setEntity(entity); 
        HttpResponse resp = mHttpClient.execute(post); 
    } 
} 

有时一切正常,但有时(特别是在连接速度较慢时)图像上传时非常损坏。示例在这里:http://pixelbirthcloud.com/574_orig.jpg

它不会抛出任何异常。上传文件的长度与原始文件的长度相同..尝试将 mime 类型更改为 application/octet-stream 或完全删除它。尝试使用超时。还是一样的结果。最终用户几乎总是上传损坏的图像(尽管我只成功获得了 bronem 图像 2 次).. 图像大小最初为 2.5 兆,但后来我将其减小到 500-700 kb。但没有解决问题。

还没有尝试更改 apache 的库..也许这就是问题所在..但据我阅读网络,没有人在使用 httpmime 库时遇到过这种情况。

它可能是什么?我现在完全迷失了:(

另一个问题是超时有时不起作用。

就像这行代码一样: HttpResponse resp = mHttpClient.execute(post); 我禁用 3g 连接,它只会等待 17-20 分钟,而不是 3 或 5 秒..然后才抛出异常。尝试了不同的方法。像这样:

        HttpParams params = new BasicHttpParams(); 
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 
        HttpProtocolParams.setUseExpectContinue(params, false);   
        HttpConnectionParams.setConnectionTimeout(params, 10000); 
        HttpConnectionParams.setSoTimeout(params, 10000); 
        ConnManagerParams.setMaxTotalConnections(params, 5); 
        ConnManagerParams.setTimeout(params, 30000); 
 
        SchemeRegistry registry = new SchemeRegistry(); 
        registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80)); 
        registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80)); 
        ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry); 
        HttpClient httpclient = new DefaultHttpClient(manager, params); 

但还是不行:)

请您参考如下方法:

查看我的图像 uploader 代码,它对我来说非常有用 此类将文件上传到服务器,最后还读取 XML 回复。 根据您的要求过滤代码。它对我来说非常顺利


package com.classifieds; 
 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
 
import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 
 
 
import android.util.Log; 
 
public class Uploader  
{ 
 
    private String Tag = "UPLOADER"; 
    private String urlString ;//= "YOUR_ONLINE_PHP"; 
    HttpURLConnection conn; 
    String exsistingFileName ; 
 
    private void uploadImageData(String existingFileName , String urlString) 
    { 
        String lineEnd = "\r\n"; 
        String twoHyphens = "--"; 
        String boundary = "*****"; 
        try { 
            // ------------------ CLIENT REQUEST 
 
            Log.e(Tag, "Inside second Method"); 
 
            FileInputStream fileInputStream = new FileInputStream(new File( 
                    exsistingFileName)); 
 
            // open a URL connection to the Servlet 
 
            URL url = new URL(urlString); 
 
            // Open a HTTP connection to the URL 
 
            conn = (HttpURLConnection) url.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: post-data; name=uploadedfile;filename=" 
                            + exsistingFileName + "" + lineEnd); 
            dos.writeBytes(lineEnd); 
 
            Log.v(Tag, "Headers are written"); 
 
            // create a buffer of maximum size 
 
            int bytesAvailable = fileInputStream.available(); 
            int maxBufferSize = 1000; 
            // int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
            byte[] buffer = new byte[bytesAvailable]; 
 
            // read file and write it into form... 
 
            int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable); 
 
            while (bytesRead > 0) { 
                dos.write(buffer, 0, bytesAvailable); 
                bytesAvailable = fileInputStream.available(); 
                bytesAvailable = Math.min(bytesAvailable, maxBufferSize); 
                bytesRead = fileInputStream.read(buffer, 0, bytesAvailable); 
            } 
 
            // send multipart form data necesssary after file data... 
 
            dos.writeBytes(lineEnd); 
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
 
            // close streams 
            Log.v(Tag, "File is written"); 
            fileInputStream.close(); 
            dos.flush(); 
            dos.close(); 
 
        } catch (MalformedURLException ex) { 
            Log.e(Tag, "error: " + ex.getMessage(), ex); 
        } 
 
        catch (IOException ioe) { 
            Log.e(Tag, "error: " + ioe.getMessage(), ioe); 
        } 
 
 
        SAXParserFactory spf = SAXParserFactory.newInstance(); 
        SAXParser sp = null; 
        try { 
            sp = spf.newSAXParser(); 
        } catch (ParserConfigurationException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } catch (SAXException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
 
        // Get the XMLReader of the SAXParser we created. 
        XMLReader xr = null; 
        try { 
            xr = sp.getXMLReader(); 
        } catch (SAXException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
        // Create a new ContentHandler and apply it to the XML-Reader 
        MyExampleHandler1 myExampleHandler = new MyExampleHandler1(); 
        xr.setContentHandler(myExampleHandler); 
 
        // Parse the xml-data from our URL.  
        try { 
            xr.parse(new InputSource(conn.getInputStream())); 
        //xr.parse(new InputSource(new java.io.FileInputStream(new java.io.File("login.xml"))));  
        } catch (MalformedURLException e) { 
            Log.d("Net Disconnected", "NetDisconeeted"); 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } catch (IOException e) { 
            Log.d("Net Disconnected", "NetDisconeeted"); 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } catch (SAXException e) { 
            Log.d("Net Disconnected", "NetDisconeeted"); 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
 
        // Parsing has finished. 
 
    } 
 
    public Uploader(String existingFileName, boolean isImageUploading , String urlString ) { 
 
        this.exsistingFileName = existingFileName; 
        this.urlString = urlString; 
 
    } 
 
    class MyExampleHandler1 extends DefaultHandler 
    { 
    // =========================================================== 
    // Methods 
    // =========================================================== 
 
    @Override 
    public void startDocument() throws SAXException { 
 
    } 
 
    @Override 
    public void endDocument() throws SAXException { 
        // Nothing to do 
    } 
 
    @Override 
    public void startElement(String namespaceURI, String localName, 
              String qName, Attributes atts) throws SAXException { 
 
 
    } 
 
    /** Gets be called on closing tags like: 
     * </tag> */ 
    @Override 
    public void endElement(String namespaceURI, String localName, String qName) 
              throws SAXException { 
 
 
    } 
 
    /** Gets be called on the following structure: 
     * <tag>characters</tag> */ 
    @Override 
    public void characters(char ch[], int start, int length) { 
 
     } 
    } 
 
} 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!