Plupload, C#, FTP и фрагментация

Я использую Plupload для управления загрузкой больших файлов. Я написал обработчик С# для загрузки с помощью FTPWebRequest, и, похоже, он работает нормально. Проблема в том, что я хотел бы использовать фрагментацию (http://www.plupload.com/docs/Chunking). Когда я включаю фрагментацию, я получаю несколько файлов, загруженных на мой FTP-сервер с именем blobxxx, blobyyyy. Вопрос в том, как мне соединить их все вместе в конце? Вот мой код - спасибо за любую помощь:

Загрузить.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="plupload.aspx.cs" Inherits="plupload" %>

<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

<title>Plupload - Custom example</title>

<!-- production -->

    <link href="plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css" rel="stylesheet" type="text/css" />

  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js" charset="UTF-8"></script>

    <script type="text/javascript" src="plupload/js/plupload.full.min.js"></script>

    <script src="plupload/js/jquery.plupload.queue/jquery.plupload.queue.min.js" type="text/javascript"></script>

<!-- debug 
<script type="text/javascript" src="../js/moxie.js"></script>
<script type="text/javascript" src="../js/plupload.dev.js"></script>
-->

</head>
<body style="font: 13px Verdana; background: #eee; color: #333">

<h1>Custom example</h1>

<p>Shows you how to use the core plupload API.</p>

<div id="filelist">Your browser doesn't have Flash, Silverlight or HTML5 support.</div>
<br />

<div id="uploader">
    <p>Your browser doesn't have Flash, Silverlight or HTML5 support.</p>
</div>

<script type="text/javascript">
// Initialize the widget when the DOM is ready
$(function() {
    // Setup html5 version
    $("#uploader").pluploadQueue({
        // General settings
        runtimes : 'html5,flash,silverlight,html4',
        url : "FileUpload.ashx",
        chunk_size: '1mb',
        max_retries: 3,

        rename : true,
        dragdrop: true,


        // Resize images on clientside if we can
        resize: {
            width : 200,
            height : 200,
            quality : 90,
            crop: true // crop to exact dimensions
        },


        // Flash settings
        flash_swf_url : 'plupload/js/Moxie.swf',

        // Silverlight settings
        silverlight_xap_url : 'plupload/js/Moxie.xap'
    });

    $("#uploader").bind("Error", function (upload, error) {
        alert(error.message);
    });

    // only allow 5 files to be uploaded at once
    $("#uploader").bind("FilesAdded", function (up, filesToBeAdded) {
        if (up.files.length > 5) {
            up.files.splice(4, up.files.length - 5);
            showStatus("Only 5 files max are allowed per upload. Extra files removed.", 3000, true);
            return false;
        }
        return true;
    });

});
</script>

</body>
</html>

FileUpload.ashx

<%@ WebHandler Language="C#" Class="FileUpload" %>

using System;
using System.Web;
using System.Net;
using System.IO;
using System.Text;

public class FileUpload : IHttpHandler {


    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.Files.Count > 0)
        {

            for (int a = 0; a <= context.Request.Files.Count - 1; a++) 
            {
                FtpWebRequest clsRequest = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(new Uri("ftp://xxxx/yyyy/" + context.Request.Files[a].FileName));

                clsRequest.Credentials = new NetworkCredential("xxx", "yyy");
                clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile;


                Stream streamReader = context.Request.Files[a].InputStream;                
                byte[] bFile = new byte[streamReader.Length];

                streamReader.Read(bFile, 0, (int)streamReader.Length);
                streamReader.Close();
                streamReader.Dispose();

                Stream clsStream = clsRequest.GetRequestStream();
                //clsStream.Write(bFile, 0, bFile.Length);

                // Write the local stream to the FTP stream
                // 2 bytes at a time
                int offset = 0;
                int chunk = (bFile.Length > 2048) ? 2048 : bFile.Length;
                while (offset < bFile.Length)
                {
                    clsStream.Write(bFile, offset, chunk);
                    offset += chunk;
                    chunk = (bFile.Length - offset < chunk) ? (bFile.Length - offset) : chunk;
                }

                clsStream.Close();
                clsStream.Dispose();

                FtpWebResponse response = (FtpWebResponse)clsRequest.GetResponse();

                response.Close();

            }
        }
    }


}

ОБНОВИТЬ**

Я изменился:

FtpWebRequest clsRequest = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(new Uri("ftp://xxxx/yyyy/" + context.Request.Files[a].FileName));

to:

 FtpWebRequest clsRequest = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(new Uri("ftp://xxxx/yyyy/" + "staticFileName.zip"));

и

clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile;

to

clsRequest.Method = System.Net.WebRequestMethods.Ftp.AppendFile;

Вроде загружается нормально. Осталось проверить скринлинг...


person Captain_Planet    schedule 31.10.2014    source источник


Ответы (1)


В вашей ссылке есть раздел под названием «Обработка на стороне сервера», в котором описывается, что вам нужно собрать файл самостоятельно. Вот ссылка на информацию о добавлении двоичных файлов: Как добавить данные в двоичный файл ?

В документации Plupload упоминается, что они делают добавление к событию ChunkUploaded и собирают файл вместе по мере его поступления.

person MikeH    schedule 31.10.2014
comment
Да, я видел подобные ссылки. И я понимаю, что это нормально, когда ваши файлы находятся на том же сервере, что и обработчик. Но как это работает по FTP с учетными данными? - person Captain_Planet; 31.10.2014
comment
@Captain_Planet Ааа, я пропустил эту часть. Итак, вы используете Plupload для отправки отдельных фрагментов на FTP-сервер? - person MikeH; 31.10.2014
comment
Да, именно так. У меня есть клиент, веб-сервер и FTP-сервер. Некоторые из загрузок от клиента, вероятно, будут довольно большими, поэтому, если бы я мог разбить их на части, я думаю, было бы лучше.... - person Captain_Planet; 31.10.2014
comment
@Captain_Planet Очень интересно. В вашем случае, я думаю, у вас должна быть какая-то программа на FTP-сервере, отслеживающая файлы и собирающая их по мере их поступления. Возможно, вместо фрагментации вы могли бы использовать функции автоматического возобновления работы FTP (я мало что знаю об этом, но это может сработать...) - person MikeH; 31.10.2014
comment
Спасибо, Майк. Да, это загадка. Я посплю... :-) - person Captain_Planet; 31.10.2014