H5에서 파일을 읽고 서버에 업로드하는 방법

php中世界最好的语言
풀어 주다: 2018-03-27 13:38:57
원래의
5917명이 탐색했습니다.

이번에는 H5파일을 읽어서서버에 업로드하는 방법을 가져오겠습니다. H5의 파일을 읽어서서버에 업로드하는 방법의 주의사항은 무엇인가요? 보세요.

참고: Ajax를 사용하여 업로드할 때 파일은 너무 커서는 안 됩니다. 300~400MB 미만이 바람직합니다. 연속적인 Ajax 요청이 너무 많으면 배경이 충돌하고 특히 InputStream의 데이터가 비어 있게 되기 때문입니다. Google 브라우저 테스트 과정 중.

1 기능 작업을 중단하고 계속합니다

<p class="container">
    <p class="panel panel-default">
        <p class="panel-heading">分段读取文件:</p>
        <p class="panel-body">
            <input type="file" id="file" />
            <blockquote style="word-break:break-all;"></blockquote>
        </p>
    </p>
</p>
로그인 후 복사
JS:

/*
* 分段读取文件为blob ,并使用ajax上传到服务器
* 分段上传exe文件会抛出异常
*/
var fileBox = document.getElementById('file');
file.onchange = function () {
    //获取文件对象
    var file = this.files[0];
    var reader = new FileReader();
    var step = 1024 * 1024;
    var total = file.size;
    var cuLoaded = 0;
    console.info("文件大小:" + file.size);
    var startTime = new Date();
    //读取一段成功
    reader.onload = function (e) {
        //处理读取的结果
        var loaded = e.loaded;
        //将分段数据上传到服务器
        uploadFile(reader.result, cuLoaded, function () {
            console.info('loaded:' + cuLoaded + 'current:' + loaded);
            //如果没有读完,继续
            cuLoaded += loaded;
            if (cuLoaded < total) {
                readBlob(cuLoaded);
            } else {
                console.log(&#39;总共用时:&#39; + (new Date().getTime() - startTime.getTime()) / 1000);
                cuLoaded = total;
            }
        });
    }
    //指定开始位置,分块读取文件
    function readBlob(start) {
        //指定开始位置和结束位置读取文件
        //console.info(&#39;start:&#39; + start);
        var blob = file.slice(start, start + step);
        reader.readAsArrayBuffer(blob);
    }
    //开始读取
    readBlob(0);
    //关键代码上传到服务器
    function uploadFile(result, startIndex, onSuccess) {
        var blob = new Blob([result]);
        //提交到服务器
        var fd = new FormData();
        fd.append(&#39;file&#39;, blob);
        fd.append(&#39;filename&#39;, file.name);
        fd.append(&#39;loaded&#39;, startIndex);
        var xhr = new XMLHttpRequest();
        xhr.open(&#39;post&#39;, &#39;../ashx/upload2.ashx&#39;, true);
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                // var data = eval(&#39;(&#39; + xhr.responseText + &#39;)&#39;);
                console.info(xhr.responseText);
                if (onSuccess)
                    onSuccess();
            }
        }
        //开始发送
        xhr.send(fd);
    }
}
로그인 후 복사

배경 코드는 위와 동일합니다


3. 세그먼트의 파일을 바이너리 배열로 읽고 ajax를 사용하여 서버에 업로드합니다

바이너리 배열 사용 전송 방식이 특히 비효율적이며, 최종 파일은 아직 원본 크기와 약간의 차이가 있습니다

HTML 내용은 위와 동일합니다

JS:

/// <summary>
/// upload2 的摘要说明
/// </summary>
public class upload2 : IHttpHandler
{
    LogHelper.LogHelper _log = new LogHelper.LogHelper();
    int totalCount = 0;
    public void ProcessRequest(HttpContext context)
    {
        HttpContext _Context = context;
        //接收文件
        HttpRequest req = _Context.Request;
        if (req.Files.Count <= 0)
        {
            WriteStr("获取服务器上传文件失败");
            return;
        }
        HttpPostedFile _file = req.Files[0];
        //获取参数
        // string ext = req.Form["extention"];
        string filename = req.Form["filename"];
        //如果是int 类型当文件大的时候会出问题 最大也就是 1.9999999990686774G
        int loaded = Convert.ToInt32(req.Form["loaded"]);
        totalCount += loaded;
        string newname = @"F:\JavaScript_Solution\H5Solition\H5Solition\Content\TempFile\";
        newname += filename;
        //接收二级制数据并保存
        Stream stream = _file.InputStream;
        if (stream.Length <= 0)
            throw new Exception("接收的数据不能为空");
        byte[] dataOne = new byte[stream.Length];
        stream.Read(dataOne, 0, dataOne.Length);
        FileStream fs = new FileStream(newname, FileMode.Append, FileAccess.Write, FileShare.Read, 1024);
        try
        {
            fs.Write(dataOne, 0, dataOne.Length);
        }
        finally
        {
            fs.Close();
            stream.Close();
        }
        _log.WriteLine((totalCount + dataOne.Length).ToString());
        WriteStr("分段数据保存成功");
    }
    private void WriteStr(string str)
    {
        HttpContext.Current.Response.Write(str); 
    }
    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
로그인 후 복사

백엔드 코드:

<p class="container">
    <p class="panel panel-default">
        <p class="panel-heading">分段读取文件:</p>
        <p class="panel-body">
            <input type="file" id="file" />
            <br />
            <input type="button" value="中止" onclick="stop();" />&emsp;
            <input type="button" value="继续" onclick="containue();" />
            <br />
            <progress id="progressOne" max="100" value="0" style="width:400px;"></progress>
            <blockquote id="Status" style="word-break:break-all;"></blockquote>
        </p>
    </p>
</p>
로그인 후 복사

마스터하셨을 거라 믿습니다. 방법은 이 글의 사례를 읽어보신 후, 더 흥미로운 내용을 보시려면 PHP 중국어 웹사이트의 다른 관련 글을 주목해주세요!

추천 도서:

HTML5

H5에서 그림 회전의 애니메이션 효과를 달성하여 데스크톱 알림을 구현하는 방법

위 내용은 H5에서 파일을 읽고 서버에 업로드하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿