Hvordan omgå [1] IE bug mens du sparer en Excel-fil fra en webserver?

stemmer
4

Jeg har lagt merke til at Internet Explorer legger inn et tall i hakeparenteser til filer som er lastet ned fra Internett (vanligvis [1]). Dette skaper et stort problem med å laste ned Excel-regneark som klammer er ikke et gyldig filnavn karakter inne Excel-regneark navn. Det problemet er IE spesifikke, andre nettlesere er å holde samme filnavn.

Så, hvis du har en pivottabell automatisk oppdateres på fil åpning for eksempel, vil du få en feilmelding som sier navnet file [1] .yourPivotTableName er ikke gyldig.

Er det noen løsning på det problemet?

EDIT: Det virker som uansett filnavnet foreslått av HTTP-direktiver , sier IE [1] i alle tilfeller, som forårsaker problemet! (Så, svar om filnavn er ikke nyttig i så fall)

EDIT: Jeg har prøvd noen VBA-kode for å lagre filen under et annet navn når det vil åpne. Men det fungerer ikke (samme feilmelding enn før). Tror du det er en måte å fikse det med VBA?

Publisert på 23/09/2008 klokken 09:49
kilden bruker
På andre språk...                            


10 svar

stemmer
0

Egentlig er den riktige NET-kode som følger:

Response.AppendHeader("content-disposition", "attachment;filename=file.xls");
Response.ContentType = "application/vnd.ms-excel";

Merk: AppendHeader , ikke AddHeader , som jeg tror fungerer bare i debug web-server og IIS7.

Svarte 23/09/2008 kl. 10:08
kilden bruker

stemmer
-1

I NET har jeg funnet fra erfaring bare dette ser ut til å fungere for meg:

            Response.AddHeader("Content-Disposition", "attachment; filename=excel.xls");
            Response.AddHeader("Content-Type", "application/vnd.ms-excel");
            Response.ContentType = "application/vnd.ms-excel";

Duplisering lukter, men så langt har jeg aldri kom til bunnen av det (kanskje Sebs innlegg forklarer dette). Også "content-Disposition" verdi vises veldig pirkete bruk en: i stedet for en, eller ommit mellomrommet mellom det og 'filnavn', og det blåser!

Også hvis du har kompresjon aktivert på IIS dette kan fikse ting for deg:

Response.ClearHeaders()
Svarte 23/09/2008 kl. 10:12
kilden bruker

stemmer
2

Jeg tror at dette skjer når du åpner regnearket i IE og IE lagrer det til en midlertidig fil. Og jeg tror det skjer bare når regnearket filnavn har mer enn en prikk i det. Prøv det med en enkel "sample.xls". En annen løsning er å fortelle brukerne å lagre filen til skrivebordet, og deretter åpne den.

Svarte 23/09/2008 kl. 10:15
kilden bruker

stemmer
2

Det er en innebygd funksjon i Internet Explorer.

Slutt å bruke "Open", begynne å bruke "Lagre" i filen laste ned vinduet, ellers IE vil føye til "[1]" til filnavnet til filen som den plasserer i noen midlertidig mappe.

Du kan bygge noen NET program som bruker System.IO.FileSystemWatcher som fanger ved etableringen av den nedlastede filen eller noe, og nytt navn på filen.

Svarte 23/09/2008 kl. 11:29
kilden bruker

stemmer
2

Jeg har fått det til å fungere ved hjelp av VBA tilbys av denne kul fyr (tenker på ham fondly). Det endrer navn på filen og deretter reattaches tappene.

http://php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/

Svarte 27/10/2008 kl. 17:38
kilden bruker

stemmer
0

Følgende har fungert for meg:

private string EncodeFileName(string fileName)
    {
        fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", " ");
        if (HttpContext.Current.Request.UserAgent.ToLower().Contains("msie"))
        {
            var res = new StringBuilder();
            var chArr = fileName.ToCharArray();
            for (var j = 0; j < chArr.Length; j++)
            {
                if (chArr[j] == '.' && j != fileName.LastIndexOf("."))
                    res.Append("%2E");
                else
                    res.Append(chArr[j]);
            }
            fileName = res.ToString();
        }
        return "\"" + fileName + "\"";
    }
Svarte 20/11/2008 kl. 05:37
kilden bruker

stemmer
0

Du kan bare være sikker på at i alternativboksen for dreie automatisk oppdatering er slått av. Nå selv når åpnet fra serveren pivot vil fungere perfekt

Svarte 19/04/2010 kl. 18:33
kilden bruker

stemmer
0

Sette disse fire linjene i koden din:

response.reset();
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate,post-check=0, pre-check=0");
response.setHeader("Pragma", "public");

Håper dette hjelper.

Svarte 28/04/2010 kl. 12:05
kilden bruker

stemmer
0

Jeg har det samme problemet, og kom opp med (IMO) en bedre løsning som ikke trenger noen VBA.

Hvis du setter "Content-Disposition" header til "attachment; filename = <...>" i stedet for "inline; filename = <...>" vanlige nettlesere vil åpne dialogboksen som vil tillate å lagre eller åpne en fil med et filnavn definert i en header, men Internet Explorer vil oppføre seg i litt rar måte. Det vil åpne dialogboksen nedlastede filen, og hvis du trykker på Lagre vil foreslå et filnavn som er definert i overskriften, men hvis du trykker Åpne det vil lagre filen til en midlertidig mappe og åpne den med et navn som er det samme som URN ( uten 'namespace'), for eksempel hvis URI er http: //server/folder/file.html , så IE vil lagre filen som file.html ! (ingen brak, woo hoo). Dette leder oss til en løsning:

Skriv et script som håndterer forespørsel fra http: // server / mappe / * og når du trenger å tjene en XLS-fil bare omdirigere til at script (bruker filnavnet i stedet for stjerne) med Content-Disposition satt til inline .

Svarte 23/08/2010 kl. 11:01
kilden bruker

stemmer
1

Jeg har løst dette problemet ved anvendelse av fremgangsmåten hvor vi passere 3 parametre: Filename, filtype (uten DOT) og HTTP-forespørselen); så gjør den UTF-8-koding av filnavnet og forlengelse. Eksempelkode:

public static String encoding(String fileName, String extension, HttpServletRequest request)
{
    String user = request.getHeader( "user-agent" );
    boolean isInternetExplorer = ( user.indexOf( "MSIE" ) > -1 );
    String var = "";
    try
    {           
    fileName = URLEncoder.encode( fileName, "UTF-8" );
        fileName = fileName.trim().replaceAll( "\\+", " " );
        extension = URLEncoder.encode( extension, "UTF-8" );
        extension = extension.trim().replaceAll( "\\+", " " );
        if ( isInternetExplorer )
        {
        disposition = "attachment; filename=\"" + fileName+"."+extension+"\"";
        }
        else
        {
        var = "attachment; filename*=UTF-8''" + fileName+"."+extension;
        }            
    }
    catch ( UnsupportedEncodingException ence )
    {
    var = "attachment; filename=\"" + fileName+"."+extension;
        ence.printStackTrace();
    }

    return var;
}

Dette fungerte helt fint i mitt tilfelle. Håper det vil hjelpe dere alle.

Svarte 08/10/2014 kl. 05:34
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more