带有服务器端 php 的 Android 文件上传器

Posted

技术标签:

【中文标题】带有服务器端 php 的 Android 文件上传器【英文标题】:Android file uploader with server-side php 【发布时间】:2011-03-13 09:07:15 【问题描述】:

我已经找了几个小时的解决方案,但我找不到任何解决方案。

基本上,我想从我的 android 设备上传文件到 http 网站。但是,我不知道如何做到这一点。我在设备上使用 java,我想在服务器端使用 php。我只想上传文件,而不是在服务器上对它们做任何花哨的事情。

谁能提供我需要的代码和/或一个好的链接?我几乎没有这方面的经验,我很茫然。

谢谢, NS

PS。我没有 PHP 编码经验。

【问题讨论】:

【参考方案1】:

是的,所以我找到了 java 方面的东西。这行得通,所以...是的。

public class Uploader extends Activity 

    private String Tag = "UPLOADER";
    private String urlString = "YOUR_ONLINE_PHP";
    HttpURLConnection conn;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String exsistingFileName = "/sdcard/uploader/data/testfile";

        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.e(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.e(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);
        

        try 
            BufferedReader rd = new BufferedReader(new InputStreamReader(conn
                    .getInputStream()));
            String line;
            while ((line = rd.readLine()) != null) 
                Log.e("Dialoge Box", "Message: " + line);
            
            rd.close();

         catch (IOException ioex) 
            Log.e("MediaPlayer", "error: " + ioex.getMessage(), ioex);
        
    

【讨论】:

我测试了这段代码,但无法上传超过 2MB 的文件,对此有任何解决方案。 遗憾的是,此代码仅适用于小文件。我们遇到了这个问题,但无论如何我们不需要上传超过几 kB,所以我们忽略了它。我们不再从事那个项目。我看到它的方式是“int bytesAvailable = fileInputStream.available();”,其中 fIS 的可用空间不超过 2MB(不太可能),或者字节缓冲区:int maxBufferSize = 1000;字节[] 缓冲区 = 新字节[bytesAvailable];尝试更改 maxBufferSize 看看会发生什么。 当您说“Java 方面的事情”时,这是否意味着此代码用于“本机应用程序”? ....因为如果是这样,那么如果用户没有应用程序,那么不会有问题吗?他们必须先将其下载到他们的安卓设备上? ...谢谢。 @dsdsdsdsd 我已经很多年没有为 android 写了,但是 IIRC 这是一个用户下载的应用程序。我不知道如果不是在设备上下载的应用程序如何收集数据... 如果 2 MB 对您来说还不够,并且无法消除此限制(与许多廉价的网络服务器一样),您可以尝试使用 FTP 客户端。【参考方案2】:

如果你想上传大于 2MB 的文件,你需要编辑你的 PHP 配置

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M

例如:

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 10M

这将允许您上传最大 10MB 大小的文件

【讨论】:

感谢您的澄清!【参考方案3】:

对于 PHP 方面的事情,看看

move_uploaded_file 以及全球$_FILES

http://php.net/manual/en/function.move-uploaded-file.php

http://php.net/manual/en/features.file-upload.php

【讨论】:

以上是关于带有服务器端 php 的 Android 文件上传器的主要内容,如果未能解决你的问题,请参考以下文章

android的自带的httpClient 怎么上传文件

文件上传(带有预览模式)

Android 上传图片并添加参数 PHP接收

使用php中的ftp将文件上传到服务器

Android端通过HttpURLConnection上传文件到服务器

Android - 在 GridView 中使用 PHP 显示服务器文件夹中的所有图像