Frage

I herunterladbaren Dateien auf Website-Nutzer zur Verfügung stellen will, will aber die URL der Dateien von dem Benutzer zu verbergen ... Ich bin einen Httphandler denken könnte den Trick tun, aber ist es möglich, eine Datei von einem abrufen ein externer Server und es den Benutzer streamen?

Vielleicht kann jemand mir einen Tip geben, wie dies zu erreichen, oder mich auf eine Ressource verweist, in dem es zuvor getan wurde?


Just zu erarbeiten, was ich versuche zu erreichen ... Ich baue eine ASP.NET-Website, die einen Musik-Download-Link enthält. Ich mag die tatsächliche URLs der Datei schützen, und ich will sie auch auf einem externen (PHP) Server speichern (viel viel billiger) ...

Also, was ich tun muß, ist einen Strom einrichten, die die Datei von einer URL (Punkte auf einem anderen Server) greifen kann, und an dem Response-Objekt-Stream ohne dass der Benutzer von einem anderen Server es zu realisieren kommen.

Wird die TransmitFile Methode ermöglicht das Streaming von einer Datei aus einem ganz anderen Server? Ich habe nicht die Datei will gestreamt „durch“ meine Server werden, da diese die Zweck (Einsparung Bandbreite) besiegt ... ich den Client (Browser), dass die Datei direkt von dem anderen Server zum Download bereit.

Habe ich einen Handler auf die Datei benötigen vielleicht Hosting-Server? Vielleicht ist ein PHP-Skript auf dem anderen Ende der Weg zu gehen ...?

War es hilfreich?

Lösung

Mit Ihrer Klärung der Bandbreite wollen von dem externen Server kommen und nicht verkaufen, es ändert sich die Frage ziemlich viel.

Um das zu erreichen, der externe Server würde eine Website auf sie haben, müssen Sie den Benutzer schicken. Sie können die Datei auf Ihrer Website streamen, aber nicht mit der Bandbreite getroffen zu werden, oder es von Ihrer Website steuern, sondern durch den anderen Server gestreamt, also muss es vollständig durch die andere Seite behandelt werden. Problem dabei ist, ein normaler URL basierten Ansatz des Benutzer die URL zeigen würde, was Sie gesagt ist die zweite Anforderung, dass es die URL nicht an.

Aber, könnte man nicht nur eine allgemeine Seite, die die Dateien auf der externen Website dient, und den Besonderheiten, auf der Datei durch einen Beitrag von der Seite, auf der Original-Website weitergegeben würde zu streamen? Das würde die URL entfernen, um eine bestimmte Datei verweist. Es würde die Domäne zeigen, aber die Benutzer nicht Dateien ziehen können, ohne die Post Felder zu kennen.

Dies würde nicht braucht ein Httphandler, nur eine normale Seite zu sein.

Andere Tipps

Ich empfehle Ihnen, die TransmitFile Methode sehen: http: // msdn. microsoft.com/en-us/library/12s31dhy.aspx

Ja, können Sie das Streaming von einem Remote-Stream (Download von einem anderen Server), um Strom. Es sei angenommen, ServiceUrl ist die Position der Datei an Strom:

HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
            webrequest.AllowAutoRedirect = false;
            webrequest.Timeout = 30 * 1000;
            webrequest.ReadWriteTimeout = 30 * 1000;
            webrequest.KeepAlive = false;

            Stream remoteStream = null;
            byte[] buffer = new byte[4 * 1024];
            int bytesRead;

            try {
                WebResponse responce = webrequest.GetResponse();
                remoteStream = responce.GetResponseStream();
                bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

                Server.ScriptTimeout = 30 * 60;
                Response.Buffer = false;
                Response.BufferOutput = false;
                Response.Clear();
                Response.ContentType = "application/octet-stream";
                Response.AppendHeader("Content-Disposition", "attachment; filename=" + Uid + ".EML");
                if (responce.ContentLength != -1)
                    Response.AppendHeader("Content-Length", responce.ContentLength.ToString());

                while (bytesRead > 0 && Response.IsClientConnected) {
                    Response.OutputStream.Write(buffer, 0, bytesRead);
                    bytesRead = remoteStream.Read(buffer, 0, buffer.Length);
                }

            } catch (Exception E) {
                Logger.LogErrorFormat(LogModules.DomainUsers, "Error transfering message from remote host: {0}", E.Message);
                Response.End();
                return;
            } finally {
                if (remoteStream != null) remoteStream.Close();
            }

            Response.End();

Ich habe das schon mal gemacht. Erstens, und offensichtlich sind die Dateien in einer Freigabe auf dem externen Server sein, dass der Benutzer Prozess der Website Zugriff hat.

Was die Httphandler geht, behandelt ich dies durch die Benutzer Dateien zip geben die Dateien, die sie herunterladen möchten enthält; auf diese Weise meine Handler jeden Anruf für ZIP-Dateien abfangen konnte und sie die Zip-Datei, die ich schaffen streamen.

Hier ist der Code (durchaus ein Stück, ich verwende MVP, so wird es aufgeteilt in Handler und Moderator): Handler:

public class ZipDownloadModule: IHttpHandler, ICompressFilesView, IErrorView 
{
    CompressFilesPresenter _presenter;

    public ZipDownloadModule()
    {
        _presenter = new CompressFilesPresenter(this, this);
    }
    #region IHttpHandler Members

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        OnDownloadFiles();
    }

    private void OnDownloadFiles()
    {
        if(Compress != null)
            Compress(this, EventArgs.Empty);
    }

    #endregion

    #region IFileListDownloadView Members

    public IEnumerable<string> FileNames
    {
        get 
        {
            string files = HttpContext.Current.Request["files"] ?? string.Empty;

            return files.Split(new Char[] { ',' });
        }
    }

    public System.IO.Stream Stream
    {
        get
        {
            HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
            HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=ads.zip");
            return HttpContext.Current.Response.OutputStream;
        }
    }

    public event EventHandler Compress;

    #endregion

    #region IErrorView Members

    public string errorMessage
    {
        set {  }
    }

    #endregion
}

Moderator:

public class CompressFilesPresenter: PresenterBase<ICompressFilesView>
{
    IErrorView _errorView;

    public CompressFilesPresenter(ICompressFilesView view, IErrorView errorView)
        : base(view)
    {
        _errorView = errorView;
        this.View.Compress += new EventHandler(View_Compress);
    }

    void View_Compress(object sender, EventArgs e)
    {
        CreateZipFile();
    }

    private void CreateZipFile()
    {
        MemoryStream stream = new MemoryStream();

        try
        {
            CreateZip(stream, this.View.FileNames);

            WriteZip(stream);
        }
        catch(Exception ex)
        {
            HandleException(ex);
        }
    }

    private void WriteZip(MemoryStream stream)
    {
        byte[] data = stream.ToArray();

        this.View.Stream.Write(data, 0, data.Length);
    }

    private void CreateZip(MemoryStream stream, IEnumerable<string> filePaths)
    {
        using(ZipOutputStream s = new ZipOutputStream(stream)) // this.View.Stream))
        {
            s.SetLevel(9); // 0 = store only to 9 = best compression

            foreach(string fullPath in filePaths)
                AddFileToZip(fullPath, s);

            s.Finish();
        }
    }

    private static void AddFileToZip(string fullPath, ZipOutputStream s)
    {
        byte[] buffer = new byte[4096];

        ZipEntry entry;

        // Using GetFileName makes the result compatible with XP
        entry = new ZipEntry(Path.GetFileName(fullPath));

        entry.DateTime = DateTime.Now;
        s.PutNextEntry(entry);

        using(FileStream fs = File.OpenRead(fullPath))
        {
            int sourceBytes;
            do
            {
                sourceBytes = fs.Read(buffer, 0, buffer.Length);
                s.Write(buffer, 0, sourceBytes);
            } while(sourceBytes > 0);
        }
    }

    private void HandleException(Exception ex)
    {
        switch(ex.GetType().ToString())
        {
            case "DirectoryNotFoundException":
                _errorView.errorMessage = "The expected directory does not exist.";
                break;
            case "FileNotFoundException":
                _errorView.errorMessage = "The expected file does not exist.";
                break;
            default:
                _errorView.errorMessage = "There has been an error. If this continues please contact AMG IT Support.";
                break;
        }
    }

    private void ClearError()
    {
        _errorView.errorMessage = "";
    }
}

Hope, das hilft !!

Okay, meine Suche scheint schriftlich zu vermeiden / Bereitstellung einig PHP-Code vergeblich ist ... hier ist, was ich mit auf der Datei (php) Server laufen werde:

http://www.zubrag.com/scripts/download.php

Dann werden die Links von meiner asp.net Web-Server das Skript zeigen wird, die dann die entsprechende Datei (also ohne direkte Downloads und ermöglicht Tracking von Downloads über Google Analytics) herunterladen werden ... Ich denke, das wird tun der Trick

Vielen Dank an Alle Greg

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top