`
haohappy2
  • 浏览: 331004 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

URL 文件上传的原理

 
阅读更多

<?php
function upload_curl_pic()
{
$url  = 'http://localhost//5-5-5//uploadfile.php';  //target url
$file = 'c:/21.jpg'; //要上传的文件
$fields['f'] = '@'.$file;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields );
curl_exec( $ch );
if ($error = curl_error($ch) ) {
       die($error);
}
curl_close($ch); 
}
upload_curl_pic();//可以扩展把图片地址传到函数中
?>


接收端:
<?php
$uploaddir = 'E:\\wwwroot\\www\\htdocs\\5-5-5\\pic_all_here\\';
$uploadfile = $uploaddir . $_FILES['f']['name'];
if (move_uploaded_file($_FILES['f']['tmp_name'], $uploadfile))

    echo "File is valid, and was successfully uploaded.\n";
} else {
            echo "Possible file upload attack!\n";
            echo 'Here is some more debugging info:';
         

       }

?>

android上面图片的上传可以用apache包里面的httpclient和MultipartEntity来上传图片,这种的上传方式的话由于都封装好了所以看不到HTTP协议里面具体是怎样上传的;
其实图片的上传还可以用Java自带的HttpURLConnection来做上传处理,例如有一个PHP写的接收图片的POST接口http://localhost/upload/upload.php
img[] 图片(支持多张图片上传)

<?php
    echo $_POST["name"];
    echo $_POST["address"];
                                                                  
    $img = $_FILES['img'];
    if ($img){
        //文件存放目录,和本php文件同级
        $dir = dirname(__file__);
        $i = 0;
        foreach ($img['tmp_name'] as $value){
            $filename = $img['name'][$i];
            if ($value){
                $savepath="$dir\\$filename";
                $state = move_uploaded_file($value, $savepath);
                //如果上传成功,预览
                if($state){
                    echo $filename." upload success";
                }
            }
            $i++;
        }
    }
?>


这时假如我们上传的参数为:
name值为this is the parameter:name
address值为this is the parameter:address
img[]的值为两张图片,路径为E:\Photos\test_1.jpg 和E:\Photos\test_2.jpg
那么我们写的POST网络请求的方法体应该为下面的格式:
-----------------------------7dc2fd5c0894
Content-Disposition: form-data; name="name"
this is the parameter:name
-----------------------------7dc2fd5c0894
Content-Disposition: form-data; name="address"
this is the parameter:address
-----------------------------7dc2fd5c0894
Content-Disposition: form-data; name="img[]"; filename="E:\Photos\test_1.jpg"
Content-Type: image/pjpeg

<图片E:\Photos\test_1.jpg的二进制数据未显示>
---------------------------7dc2fd5c0894
Content-Disposition: form-data; name="img[]"; filename="E:\Photos\test_2.jpg"
Content-Type: image/pjpeg
<图片E:\Photos\test_2.jpg的二进制数据未显示 >
-----------------------------7dc2fd5c0894--

根据上面的格式我们写的上传图片的Java代码如下:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
                                    
public class Main {
                                    
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("E:\\Photos\\test_1.jpg");//要上传的文件路径
        list.add("E:\\Photos\\test_2.jpg");//要上传的文件路径
                                    
        upload("this is the parameter:name", "this is the parameter:address",
                list);
    }
                                    
    public static void upload(String name, String address, List<String> list) {
                                    
        try {
            // 定义数据分隔线
            String BOUNDARY = "------------------------7dc2fd5c0894";
            // 定义最后数据分隔线
            byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
                                    
            URL url = new URL("http://localhost/upload/upload.php");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                                    
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)");
            conn.setRequestProperty("Charsert", "UTF-8");
            conn.setRequestProperty("Content-Type",
                    "multipart/form-data; boundary=" + BOUNDARY);
                                    
            OutputStream out = new DataOutputStream(conn.getOutputStream());
                                    
            // name参数
            StringBuffer params = new StringBuffer();
            params.append("--" + BOUNDARY + "\r\n");
            params.append("Content-Disposition: form-data; name=\"name\"\r\n\r\n");
            params.append(name);
            params.append("\r\n");
                                    
            // address参数
            params.append("--" + BOUNDARY + "\r\n");
            params.append("Content-Disposition: form-data; name=\"address\"\r\n\r\n");
            params.append(address);
            params.append("\r\n");
                                    
            out.write(params.toString().getBytes());
                                    
            int leng = list.size();
            for (int i = 0; i < leng; i++) {
                String fname = list.get(i);
                File file = new File(fname);
                                    
                StringBuilder sb = new StringBuilder();
                sb.append("--");
                sb.append(BOUNDARY);
                sb.append("\r\n");
                sb.append("Content-Disposition: form-data;name=\"img[]\";filename=\""
                        + file.getName() + "\"\r\n");
                // 这里不能漏掉,根据文件类型来来做处理,由于上传的是图片,所以这里可以写成image/pjpeg
                sb.append("Content-Type:image/pjpeg\r\n\r\n");
                out.write(sb.toString().getBytes());
                                    
                DataInputStream in = new DataInputStream(new FileInputStream(
                        file));
                int bytes = 0;
                byte[] bufferOut = new byte[1024];
                while ((bytes = in.read(bufferOut)) != -1) {
                    out.write(bufferOut, 0, bytes);
                }
                out.write("\r\n".getBytes());
                in.close();
            }
            out.write(end_data);
            out.flush();
            out.close();
                                    
            // 定义BufferedReader输入流来读取URL的响应
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
                                    
        } catch (Exception e) {
            System.out.println("发送POST请求出现异常!" + e);
            e.printStackTrace();
        }
    }
                                    
}
这样就可以把多张图片和参数上传到服务器了。当然这里只是一个演示,是用php写的接口并只是简单的把图图片保存在了接口文件的当前文件夹下;另外图片也没有做压缩,android手机上面上传时一般会做压缩,而且也不会一个接口上传多张图片,网络差时给用户的体验很不好,但是对于互联网开发者来说深入理解HTTP协议对表单是怎样处理的这个还是很重要

分享到:
评论

相关推荐

    文件上传原理

    6. **响应确认**:服务器向客户端返回一个响应,通常包含文件上传的状态信息,如是否成功、文件URL等,以便前端进行后续操作。 #### 二、技术实现细节 - **MIME类型**:在文件上传过程中,为了确保服务器能够正确...

    计算机病毒与防护:文件上传漏洞原理.ppt

    计算机病毒与防护:文件上传漏洞原理 文件上传漏洞是网络安全领域中的一个重要问题,尤其是在Web应用程序中,这种漏洞可能导致严重的安全威胁。许多网站提供文件上传功能,例如用户上传头像、社交网络上的照片分享...

    Python - Flask 使用Ajax 实现多文件上传

    **二、文件上传原理** 在HTML中,`&lt;input type="file"&gt;`标签用于选择本地文件。在Flask中,通过`request.files`对象可以访问到这些上传的文件。每个文件都被封装为一个`FileStorage`对象,可以读取、保存或处理。 *...

    Java自带的HttpURLConnection访问接口实现文件上传

    这个接口在java.net包下,是处理HTTP请求的基础类,包括...虽然这需要对HTTP协议有一定的理解,但它是理解网络编程和文件上传原理的一个好起点。在实际开发中,我们还需要考虑如安全性、错误处理和性能优化等更多因素。

    15文件上传漏洞原理与实战.zip

    本主题将深入探讨文件上传漏洞的原理、攻击手段以及如何进行防御。 首先,我们来理解什么是文件上传漏洞。在许多Web应用中,用户可能需要上传图片、文档等文件以实现某些功能,如个人资料的编辑、内容分享等。然而...

    C#实现文件上传

    ### C#实现文件上传的关键知识点 #### 一、概述 在C#中实现文件上传是一项常见但非常重要的功能,尤其对于Web应用来说更是如此。本文将深入探讨如何使用C#来实现文件上传,并重点关注以下几个方面:如何利用C#进行...

    okhttp多文件上传

    二、多文件上传原理 多文件上传通常涉及表单数据的Multipart编码。在HTTP请求中,MIME类型为`multipart/form-data`的表单数据允许我们将多个部分(如文本字段和文件)组合在一起发送。每个部分都有自己的头信息,...

    c++实现向web服务器上传文件

    在文件上传场景中,客户端会将文件内容作为请求体发送给服务器。 在C++中,我们可以利用libcurl库来实现HTTP POST请求。libcurl是一个强大的URL传输库,支持多种协议,包括HTTP。首先,需要在VS2013项目中添加...

    上传文件AJAX

    ### AJAX文件上传原理 1. **创建XMLHttpRequest对象**:在所有现代浏览器中,JavaScript内置了XMLHttpRequest对象,用于与服务器进行异步通信。 2. **设置请求方法和URL**:使用XMLHttpRequest对象的`open()`方法...

    文件上传+自定义上传文本框

    一、文件上传原理 文件上传的核心是HTTP协议中的POST请求。在HTML表单中,通过`&lt;input type="file"&gt;`元素,用户可以选择本地文件,然后通过提交表单,将选定的文件以二进制数据的形式发送到服务器。服务器端通常使用...

    mvc文件上传

    一、MVC文件上传的基本原理 在MVC中,文件上传主要依赖于HTTP协议的多部分/混合内容类型(multipart/form-data)。当用户在表单中选择文件并提交时,浏览器会将表单数据分割成多个部分,每个部分包含一个键值对或者...

    silverlight 文件上传,文件上传进度,大文件上传,中文注释

    首先,让我们深入了解Silverlight文件上传的基本原理。在Silverlight中,文件上传通常是通过`HttpWebRequest`对象实现的,它允许客户端向服务器发送HTTP请求。用户可以选择文件后, Silverlight应用将读取文件内容并...

    HTML多文件上传插件,可一次上传多个文件.zip

    综上所述,这个压缩包提供的资源涵盖了HTML多文件上传的基本原理、jQuery Form插件的使用、BootStrap FileInput的前端实现,以及与后端交互的策略,对开发者实现高效的文件上传功能大有裨益。在实际应用中,开发者应...

    ajax异步文件上传,servlet处理

    AJAX异步文件上传原理 在HTML5之前,由于浏览器安全限制,AJAX无法直接处理文件,但HTML5引入了`FormData`对象,使得AJAX能够处理文件上传。用户通过`&lt;input type="file"&gt;`选择文件后,将文件添加到`FormData`对象...

    jquery 文件批量上传控件

    在网页开发中,用户交互体验的提升往往离不开高效、便捷的文件上传功能。jQuery作为一个广泛使用的JavaScript库,提供了丰富的插件来增强这一功能,其中“jQuery文件批量上传控件”就是一种实用的解决方案。这个控件...

    javaweb文件上传与下载模块源代码

    通过学习这个源代码模块,开发者不仅可以了解文件上传和下载的基本原理,还能学习到如何在实际项目中应用这些技术,从而提升Web应用的交互性和功能性。对于初学者,这是一个很好的实践平台,有助于加深对Java Web...

    文件上传源代码、文件上传实例

    通过学习和分析这些代码,开发者可以理解文件上传的实现原理,并能应用于自己的项目中。 为了保证文件上传的安全性,还需要考虑以下几点: - **限制文件类型**:只允许特定类型的文件上传,比如图片、文档等,防止...

    文件上传插件SWFUpload的使用指南

    - `upload_url`:指定文件上传的服务器地址。 - `flash_url`:指定SWFUpload的Flash文件路径。 - `file_post_name`:设置上传文件在服务器端的字段名。 - `post_params`:额外的POST参数,用于传递其他信息。 -...

    delphi上传文件到php网站

    首先,我们要理解文件上传的基本原理。在HTTP协议中,文件上传通常通过POST请求来完成,其中包含了表单数据和文件内容。在Delphi中,可以使用 Indy(Internet Direct) 或 WinINet 等网络库来构造这样的请求。Indy ...

    http post方式上传文件(C#)

    以下是一个基本的文件上传示例,使用`HttpClient`: ```csharp using System.IO; using System.Net.Http; using System.Threading.Tasks; public async Task UploadFile(string url, string filePath) { var ...

Global site tag (gtag.js) - Google Analytics