低版本ie保存文件时,文件名过长被截断

在工作中有一个下载文件的功能,遇到一个低版本ie保存文件时,文件名过长被截断的问题。

asp.net MVC下载文件代码:

1 1HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadFilePath);
2 request.KeepAlive = false;
3 WebResponse response = request.GetResponse();
4 Stream stream = response.GetResponseStream();
5 return File(stream, "application/octet-stream" , HttpUtility.UrlEncode(downloadFileName, System.Text.Encoding.UTF8).Replace("+", "%20"));

开始时,将文件名用utf-8编码,通过查看响应标头,可以看到完整的utf-8编码后的文件名。但是在保存时,如果文件名过长,文件名会从前面被截断

  

修改后的下载文件代码:  

 1 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadFilePath);
 2 request.KeepAlive = false;
 3 WebResponse response = request.GetResponse();
 4 List<byte> bytes = new List<byte>();
 5 using (Stream stream = response.GetResponseStream())
 6 {
 7     int temp = stream.ReadByte();
 8     while (temp != -1)
 9     {
10         bytes.Add((byte)temp);
11         temp = stream.ReadByte();
12     }
13 }
14 Response.Clear();
15 //设置响应头编码为gb2312,如果直接返回UTF-8编码的文件名,低版本ie保存文件时,如果文件名过长,会将文件名前面部分截断
16 //设置响应头编码为gb2312后文件名如果长太多,低版本ie保存文件时,仍会截断
17 Response.HeaderEncoding = System.Text.Encoding.GetEncoding("gb2312");
18 Response.AddHeader("Content-Disposition", "attachment; filename=\"" + downloadFileName + "\"");
19 Response.ContentEncoding = System.Text.Encoding.UTF8;
20 Response.ContentType = "application/octet-stream";
21 Response.BinaryWrite(bytes.ToArray());
22 Response.Flush();
23 Response.End();
24 return new EmptyResult();

修改后将响应标头的编码设置为gb2312,文件名不进行编码

对比可以看到到,这次响应标头中的文件名长度变短了,所以保存时文件名未被截断。这种方式只是相对于utf-8编码方式来说,减少了响应标头中的文件名长度,但是如果文件名长度更长之后,仍可能出现文件名被截断的情况。

转载于:https://www.cnblogs.com/muliang/p/9371285.html

PyQt是Python的GUI编程库,可以用它来创建各种GUI应用程序。要保存文件并修改文件名,可以使用QFileDialog来选择文件路径和文件名,然后使用QFile来保存文件。 以下是一个简单的示例代码,演示了如何使用PyQt保存文件并修改文件名: ```python from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFileDialog from PyQt5.QtGui import QTextDocument, QTextCursor from PyQt5.QtCore import QFile, QTextStream class MyWidget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Save file') # 创建文本编辑器 self.textEdit = QTextEdit(self) self.textEdit.setGeometry(10, 10, 230, 100) # 创建保存按钮 saveButton = QPushButton('Save', self) saveButton.setGeometry(10, 120, 80, 25) saveButton.clicked.connect(self.saveFile) def saveFile(self): # 显示文件对话框以获取文件路径和名称 options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getSaveFileName(self,"Save file", "","All Files (*);;Text Files (*.txt)", options=options) if fileName: # 使用QFile保存文件 file = QFile(fileName) if file.open(QFile.WriteOnly | QFile.Text): # 获取文本编辑器中的文本 text = self.textEdit.toPlainText() # 将文本写入文件中 out = QTextStream(file) out << text file.flush() file.close() # 程序入口 if __name__ == '__main__': app = QApplication(sys.argv) ex = MyWidget() ex.show() sys.exit(app.exec_()) ``` 运行该代码后,单击“Save”按钮将显示一个对话框,您可以在其中输入文件名保存路径。单击“Save”按钮后,该文件将被保存到指定的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值