2

ご挨拶!

サポートしているシステムに問題があります。ユーザーが履歴書をデータベース (MS SQL Server 2005) にアップロードできるシナリオがあり、アプリケーションはこれらのドキュメントを varbinary 列を持つテーブルに格納する必要があると判断されました。インターネットで見つけた多くの例を試しましたが、アプリケーションが Microsoft Word ドキュメント (.doc) からバイトを保存しない理由がわかりません。より新しいバージョン (.docx または xlsx) または .txt を保存しようとすると、機能は完全に機能します。

同じ列にpdfファイルも保存しようとしましたが、うまくいきませんでした。ドキュメント形式の何かだと思いますが、わかりません

皆さん、助けていただけませんか。私は必死に1つの解決策を探しています。

テーブル用に作成したスクリプトは次のとおりです。

CREATE TABLE [dbo].[resumes](
    [id_professional] [int] NOT NULL,
[professional_name] [varchar](50)  NULL,
[file_type] [varchar](50) NULL,
[data] [varbinary](max)  NULL,
CONSTRAINT [PK_resumes] PRIMARY KEY CLUSTERED 
(
    id_professional] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

そして、これが私がそれを機能させようとしているコードです:

foreach (string upload in Request.Files)
{
    //create byte array of size equal to file input stream
byte[] fileData = new byte[Request.Files[upload].InputStream.Length];
//add file input stream into byte array
Request.Files[upload].InputStream.Read(fileData, 0,
    Convert.ToInt32(Request.Files[upload].InputStream.Length));
//create system.data.linq object using byte array
System.Data.Linq.Binary binaryFile = new System.Data.Linq.Binary(fileData);

Resume objResume = new Resume()
objResume.data= binaryFile;

ResumeDAO.Save(objResume);
}

ちなみに、このアプリケーションでは linq to sql を使用しています。

4

2 に答える 2

1

単一行 テーブルに任意のファイルを挿入します。そして、ハードディスクに書き戻すための単一の動的手順...これを探しているかもしれません::

--FIRST CHANGE THE CONFIGURATION TO ACTIVATE THIS FEATURE
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ole Automation Procedures';
GO
---------------------------------------------------------

--HOW TO WRITE FILES TO DIRECTLY SQL SERVER FROM DISC
CREATE TABLE [dbo].[tblTemp](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ImageType] [varchar] (10) NULL,
[ImageFile] [image] NULL
) ON [PRIMARY]

Insert [tblTemp] (ImageFile) Select '.PDF',BulkColumn from Openrowset( Bulk 'C:\mak\A.PDF', Single_Blob) as tb
-----------------------------------------------------

--HOW TO WRITE FILE TO DISC FROM SQL SERVER
--WriteBinaryToDisc 'C:\NEWF\','MAK','.PDF','DOC_TABLE','DOC_ID','DOC_IMAGE','WHERE DOC_ID=''25'''
ALTER PROCEDURE WriteBinaryToDisc 
(
@Path VARCHAR(255),
@Filename VARCHAR(100),
@FileExt VARCHAR(4),
@TblName varchar(50),
@IDField VARCHAR(50),
@ImageField VARCHAR(50),
@WHERE VARCHAR(300)
    )
AS
set nocount on
EXEC ('
DECLARE @SOURCEPATH VARBINARY(MAX),
@DESTPATH VARCHAR(MAX),
@ObjectToken INT,
@image_ID BIGINT

DECLARE IMGPATH CURSOR FAST_FORWARD FOR SELECT '+@ImageField+','+@IDField+' from     '+@TblName+' '+@WHERE+' 
OPEN IMGPATH

FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID

WHILE @@FETCH_STATUS = 0
BEGIN
SET @DESTPATH = '''+@Path+'\'+@Filename+'''+ CAST(@image_ID AS     varchar)+'''+@FileExt+'''

EXEC sp_OACreate ''ADODB.Stream'', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, ''Type'', 1
EXEC sp_OAMethod @ObjectToken, ''Open''
EXEC sp_OAMethod @ObjectToken, ''Write'', NULL, @SOURCEPATH
EXEC sp_OAMethod @ObjectToken, ''SaveToFile'', NULL, @DESTPATH, 2
EXEC sp_OAMethod @ObjectToken, ''Close''
EXEC sp_OADestroy @ObjectToken

FETCH NEXT FROM IMGPATH INTO @SOURCEPATH, @image_ID
END

CLOSE IMGPATH
DEALLOCATE IMGPATH
')
---------------------------------------------------------------

ここであなたがしなければならないことは、最初にファイルをサーバーにアップロードし、必要に応じて変更して上記のステートメントを実行することです。任意のファイルをサポートする画像データ型を使用しています。そのため、後でファイルとして hdd に再度保存するときに、その拡張子を再度添付できるように、拡張子を保存します。

于 2013-06-12T15:27:29.043 に答える
0

この問題はマルチバイト エンコーディングに起因していると感じています。

☃ のような Unicode 文字の「長さ」は 1 ですが、バイト数は 6 です。

それ以外の

Convert.ToInt32(Request.Files[upload].InputStream.Length)

使用する

Request.Files[upload].ContentLength
于 2013-06-12T14:03:12.740 に答える